使用dplyr :: mutate比较两个数据帧的新列

时间:2016-04-11 01:56:38

标签: r group-by dataframe dplyr

我有两个数据框,A和B.第一个数据框包含年份,组名和名称。第二个数据帧记录完整的组列表。我想在A数据帧中创建一个变量。如果A数据框中的名称出现在B的年份/组列表中,则应将其编码为“Y”,否则为“N”。

数据框和B数据框是:

A <- data.frame(year = c("2000", "2000", "2000", "2000", "2002", "2002", "2003", "2003", "2003"), group = c("Star", "Star", "Sun", "Sun", "Mars", "Earth", "Earth", "Star", "Star"), name = c("John", "Bill", "Summer", "Evans", "Ben", "Mary", "Kally", "John", "Carl"))
B <- data.frame(year = c("2000", "2000", "2000", "2000", "2000", "2002", "2002","2002", "2003", "2003", "2003", "2003", "2003"), group = c("Star", "Star", "Star", "Sun", "Sun", "Mars", "Mars","Earth", "Earth", "Star", "Star", "Star", "Star"), namelist = c("John", "Helen", "Gray", "Summer", "Evans", "Kevin", "Ben", "Ring", "Steve", "Billy", "Carl", "Michel", "John"))

例如,在2000年,B数据框显示Star有John,Helen和Gray。因此,因为2000年的数据帧的Star有John和Carl,A数据帧的新变量的前两行是“Y”和“N”。结果应该是这样的:

    year    group   name    in_the_list
1   2000    Star    John    Y
2   2000    Star    Bill    N
3   2000    Sun     Summer  Y
4   2000    Sun     Evans   Y
5   2002    Mars    Ben     Y
6   2002    Earth   Mary    N
7   2003    Earth   Kally   N
8   2003    Star    John    Y
9   2003    Star    Carl    Y

2 个答案:

答案 0 :(得分:1)

将列粘贴到表单ID并检查它是否存在于B

使用dplyr包:

A$in_the_list <- c("N", "Y")[Reduce(paste, A) %in% Reduce(paste, B) + 1]

使用基本功能:

Preference

答案 1 :(得分:0)

您可以利用dplyr的{​​{1}},它返回另一个数据框架的行:

semi_join