r - name - минус работа кадров данных



r adding title to ggplot2 (5)

Вы можете проверить значения как в столбцах, так и в подмножестве (просто добавив другое решение):

na.omit( df1[ sapply( 1:ncol(df1) , function(x) ! df1[,x] %in% df2[,x] ) , ] )
#  c1 c2
#1  a  1
#2  b  2

https://ffff65535.com

У меня есть 2 кадра данных df1 и df2 .

df1 <- data.frame(c1=c("a","b","c","d"),c2=c(1,2,3,4) )
df2 <- data.frame(c1=c("c","d","e","f"),c2=c(3,4,5,6) )
> df1
  c1 c2
1  a  1
2  b  2
3  c  3
4  d  4
> df2
  c1 c2
1  c  3
2  d  4
3  e  5
4  f  6

Мне нужно выполнить операцию установки этих двух кадров данных. Я использовал merge(df1,df2,all=TRUE) и merge(df1,df2,all=FALSE) чтобы получить объединение и пересечение этих кадров данных и получить требуемый результат. Какова функция, чтобы получить минус этих кадров данных, то есть все позиции, существующие на одном кадре данных, но не другие? Мне нужен следующий вывод.

 c1 c2
1  a  1
2  b  2

Вы можете создать столбцы идентификаторов, а затем подмножество:

например

df1 <- data.frame(c1=c("a","b","c","d"),c2=c(1,2,3,4), indf1 = rep("Y",4) )
df2 <- data.frame(c1=c("c","d","e","f"),c2=c(3,4,5,6),indf2 = rep("Y",4) )
merge(df1,df2)
#  c1 c2 indf1 indf2
#1  c  3     Y     Y
#2  d  4     Y     Y

bigdf <- merge(df1,df2,all=TRUE)
#  c1 c2 indf1 indf2
#1  a  1     Y  <NA>
#2  b  2     Y  <NA>
#3  c  3     Y     Y
#4  d  4     Y     Y
#5  e  5  <NA>     Y
#6  f  6  <NA>     Y

Затем подмножество, как вы пожелаете:

 bigdf[is.na(bigdf$indf1) ,]
#  c1 c2 indf1 indf2
#5  e  5  <NA>     Y
#6  f  6  <NA>     Y

 bigdf[is.na(bigdf$indf2) ,]  #<- output you requested those not in df2
#  c1 c2 indf1 indf2
#1  a  1     Y  <NA>
#2  b  2     Y  <NA>

Я предпочитаю пакет sqldf :

require(sqldf)
sqldf("select * from df1 except select * from df2")

##   c1 c2
## 1  a  1
## 2  b  2

Я помню, как я встретил этот точный вопрос несколько месяцев назад. Умело просеивать мои однострочники Evernote.

Примечание. Это не мое решение. Кредит принадлежит тому, кто его написал (которого я пока не могу найти).

Если вы не беспокоитесь о rownames вы можете сделать следующее:

df1[!duplicated(rbind(df2, df1))[-seq_len(nrow(df2))], ]
#   c1 c2
# 1  a  1
# 2  b  2

Редактирование: решение data.table :

dt1 <- data.table(df1, key="c1")
dt2 <- data.table(df2)
dt1[!dt2]

или лучше однострочный (от версии 1.9.6 +):

setDT(df1)[!df2, on="c1"]

Это возвращает все строки в df1 где df2$c1 не имеет соответствия с df1$c1 .


Это то, что я пробовал: у меня есть 2 кадра данных df2 и df_name

df2
name2 age
b 10
c 20
d 30

df_name
имя возраст хобби
10 танцев
b 20 петь
c 30 играть

Чтобы найти df_name MINUS df2:

1. Измените 2 кадра данных.
dfmerge <- merge (x = df_name, y = df2, by.x = c ("name"), by.y = c ("name2"), all = TRUE)

dfmerge

имя возраст.x хобби age.y
1 a 10 танцев NA
2 b 20 петь 10
3 c 30 играть 20
4 d NA 30

dfmerge [is.na (dfmerge $ age.y)]

имя возраст.x хобби age.y
1 a 10 танцев NA





dataframe