如何使用另一个R数据帧的值对一个R数据帧进行子集化?

时间:2017-03-05 03:30:47

标签: r dataframe

我在R中有两个数据帧:

Died.At <- c(22,40,72,41, ...)
Writer.At <- c(16, 18, 36, 36)
Name <- c("John Doe", "Edgar Poe", "Walt Whitman", "Jane Austen", ...)
Gender <- c("MALE", "MALE", "MALE", "FEMALE", ...)
Date.Of.Death <- c("2015-05-10", "1849-10-07", "1892-03-26","1817-07-18", ...)
Pet <- c("cat", "dog", "cat", "cat")
df1 = data.frame(Died.At, Writer.At, Name, Gender, Pet)
print(df1)
  Died.At Writer.At     Name          Gender    Pet
1      22        16     John Doe      MALE      cat
2      40        18     Edgar Poe     MALE      dog
3      72        36     Walt Whitman  MALE      cat
4      41        36     Jane Austen   FEMALE    cat
.....

df1Name的每一行都不是唯一的(即有多个行具有相同的作者。)

第二个数据框df2,还有一个列Name,其中包含来自df1的作者(例如Jane Austen)和全新的作者。这个数据框架也要大得多。

print(length(unique(df1$Name)))
## output 1168
print(length(unique(df2$Name)))
## output 5572

我想将df2分组,以便唯一的名称是来自df1的名称。

我的想法是这样做:

subset_df2 = df2[df2$Name == unique(df1$Name)]

但是,我希望这里有1168个独特的作者名称:

print(length(unique(subset_df2$Name)))
## output 880

这比我预期的要少。我的错误在哪里?

1 个答案:

答案 0 :(得分:3)

您可以使用match(df2$Name, df1$Name)df2$Name %in% df1$Name返回逻辑长度为df2 $ Name的逻辑向量,逻辑为TRUE,其中df2 $ Name为df1 $ Name。然后,您可以使用它来索引df2。

subset_df2 <- df2[df2$Name %in% df1$Name, ]

请参阅?match

至于为什么你的代码不起作用,请参阅本练习的输出:

a = LETTERS[sample(1:10, size=15, replace=T)]
b = c(unique(a), LETTERS[15:30])
# compare
b == unique(a) 
b[b == unique(a)]
# vs
b %in% a
b[b %in% a]

另请注意,b %in% a不等同于a %in% b,因此b[a %in% b]会产生错误的结果。

此外,在索引数据框时,您需要提供行范围和列范围。