使用dplyr::mutate比较两个数据帧的新列
我有两个数据框,A和B。第一个数据框包含年份、组名和名称。第二个数据帧记录完整的组列表。我想在数据帧中创建一个变量。如果数据框中的名称出现在B的年份/组列表中,则应将其编码为“Y”,否则为“N” A数据帧和B数据帧是:使用dplyr::mutate比较两个数据帧的新列,r,group-by,dataframe,dplyr,R,Group By,Dataframe,Dplyr,我有两个数据框,A和B。第一个数据框包含年份、组名和名称。第二个数据帧记录完整的组列表。我想在数据帧中创建一个变量。如果数据框中的名称出现在B的年份/组列表中,则应将其编码为“Y”,否则为“N” A数据帧和B数据帧是: A <- data.frame(year = c("2000", "2000", "2000", "2000", "2002", "2002", "2003", "2003", "2003"), group = c("Star", "Star", "Sun", "Sun",
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"))
粘贴列以形成ID,并检查它是否存在于B中 使用dplyr包:
mutate(A, in_the_list=c("N", "Y")[paste(year,group,name) %in% Reduce(paste, B) + 1])
使用基本函数:
A$in_the_list <- c("N", "Y")[Reduce(paste, A) %in% Reduce(paste, B) + 1]
A$在\u列表中粘贴列以形成ID,并检查B中是否存在该列
使用dplyr包:
mutate(A, in_the_list=c("N", "Y")[paste(year,group,name) %in% Reduce(paste, B) + 1])
使用基本函数:
A$in_the_list <- c("N", "Y")[Reduce(paste, A) %in% Reduce(paste, B) + 1]
A$在\u列表中您可以利用dplyr
的semi\u join
,它返回一个data.frame中位于另一个data.frame中的行:
library(dplyr)
full_join(A, semi_join(A, rename(B, name = namelist)) %>%
mutate(in_the_list = TRUE)) %>%
mutate(in_the_list = !is.na(in_the_list))
# year group name in_the_list
# 1 2000 Star John TRUE
# 2 2000 Star Bill FALSE
# 3 2000 Sun Summer FALSE
# 4 2000 Sun Evans FALSE
# 5 2002 Mars Ben TRUE
# 6 2002 Earth Mary FALSE
# 7 2003 Earth Kally FALSE
# 8 2003 Star John TRUE
# 9 2003 Star Carl FALSE
您可以利用dplyr
的semi_join
,它返回一个data.frame中位于另一个data.frame中的行:
library(dplyr)
full_join(A, semi_join(A, rename(B, name = namelist)) %>%
mutate(in_the_list = TRUE)) %>%
mutate(in_the_list = !is.na(in_the_list))
# year group name in_the_list
# 1 2000 Star John TRUE
# 2 2000 Star Bill FALSE
# 3 2000 Sun Summer FALSE
# 4 2000 Sun Evans FALSE
# 5 2002 Mars Ben TRUE
# 6 2002 Earth Mary FALSE
# 7 2003 Earth Kally FALSE
# 8 2003 Star John TRUE
# 9 2003 Star Carl FALSE
这里是一个以dplyr为中心的答案,使用mutate将年份、组和名称三元组转换为a表和B表中唯一的id变量,然后使用left_连接识别a中共享相同年份/组/名称的观测值
library(dplyr)
A <- A %>%
mutate(ygn=paste0(year,group,name))
B <- B %>%
mutate(ygn=paste0(year,group,namelist)) %>%
mutate(inthelist="Y") %>%
select(ygn, inthelist)
Newtbl <- left_join(A,B, by="ygn") %>%
select(year,group,name,inthelist) %>%
mutate(inthelist=ifelse(is.na(inthelist),"N",inthelist))
Outputs:
year group name inthelist
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
库(dplyr)
A%
突变(ygn=0(年份、组、名称))
B%
突变(ygn=0(年份、组、名单))%>%
突变(inthelist=“Y”)%%>%
选择(ygn,在列表中)
新BL%
选择(年份、组、名称、列表中)%>%
突变(inthelist=ifelse(is.na(inthelist),“N”,inthelist))
产出:
年度组名称列表
2000年明星约翰·Y
2000年明星比尔N
32000年夏季阳光明媚
2000年4月太阳埃文斯Y
2002年5月5日
6 2002地球玛丽N
2003年7月
8 2003年明星约翰·Y
9 2003年明星卡尔·Y
这里有一个以dplyr为中心的答案,使用mutate将年份、组和名称三元组转换为a表和B表中唯一的id变量,然后使用左连接识别a中共享同一年/组/名称的观察值
library(dplyr)
A <- A %>%
mutate(ygn=paste0(year,group,name))
B <- B %>%
mutate(ygn=paste0(year,group,namelist)) %>%
mutate(inthelist="Y") %>%
select(ygn, inthelist)
Newtbl <- left_join(A,B, by="ygn") %>%
select(year,group,name,inthelist) %>%
mutate(inthelist=ifelse(is.na(inthelist),"N",inthelist))
Outputs:
year group name inthelist
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
库(dplyr)
A%
突变(ygn=0(年份、组、名称))
B%
突变(ygn=0(年份、组、名单))%>%
突变(inthelist=“Y”)%%>%
选择(ygn,在列表中)
新BL%
选择(年份、组、名称、列表中)%>%
突变(inthelist=ifelse(is.na(inthelist),“N”,inthelist))
产出:
年度组名称列表
2000年明星约翰·Y
2000年明星比尔N
32000年夏季阳光明媚
2000年4月太阳埃文斯Y
2002年5月5日
6 2002地球玛丽N
2003年7月
8 2003年明星约翰·Y
9 2003年明星卡尔·Y
我可以问一下为什么必须使用dplyr::mutate而不是基函数吗?顺便说一句,您的数据中有一个输入错误(Evens而不是Evans)。frame BIf dplyr::mutate是不必要的,那么您可以在列表中执行:B$我可以问一下为什么您必须使用dplyr::mutate而不是基函数吗?顺便说一句,您的数据中有一个输入错误(Evens而不是Evans)。frame BIf dplyr::mutate是不必要的,那么您可以在列表中执行:B$