我在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
的作者(例如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
这比我预期的要少。我的错误在哪里?
答案 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]
会产生错误的结果。
此外,在索引数据框时,您需要提供行范围和列范围。