Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用dplyr::mutate比较两个数据帧的新列_R_Group By_Dataframe_Dplyr - Fatal编程技术网

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

使用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和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", "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$