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



我在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
.....

df1并非Name的每一行都是唯一的(即有几行具有相同的作者)。

第二个数据帧df2,还有一个专栏Name,既有来自df1的作者(例如简·奥斯汀),也有全新的作者。此数据帧也大得多。

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

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

您可以使用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]会产生不正确的结果。

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

最新更新