我有一组列,其名称由多个项目组成,类似于以下内容:
df1<-data.frame(`apple,onion,pear`=0,`apple,banana,onion,pear`=0,`banana,pear`=0)
我在数据框中也有一组包含项目的列:
df2<-data.frame(thing_1=c('apple','onion','pear','banana'),thing_2=c('onion',NA,'banana','tree'),thing_3=c(NA,NA,'apple','pear'),thing_4=c(NA,NA,NA,'lobster'))
对于每个以itemlist命名的列,我希望对df2
每行中不存在于列名中的项目进行计数。 NA不应该视为不匹配。真实数据集中存在数百行和列,但是存在固定数量的thing_
列。
所需的输出如下:
desiredresult<-data.frame(thing_1=c('apple','onion','pear','banana'),thing_2=c('onion',NA,'banana','tree'),thing_3=c(NA,NA,'apple','pear'),thing_4=c(NA,NA,NA,'lobster'),
'apple,onion,pear'=c(0,0,1,3),`apple,banana,onion,pear`=c(0,0,0,2),'banana,pear'=c(2,1,1,2))
作为逻辑的简要说明:
对于apple.onion.pear
列,行1为0,因为thing_1
中的“ apple”和thing_2
中的“ onion”都出现在列名中,并且NA不会引起不匹配。第3行的值为1,因为thing_2
是“香蕉”,它没有出现在列名中,而其他所有项都不是NA或可以在列名中找到。
到目前为止,我一直在与grepl()
合作,但是我很困惑!任何帮助将不胜感激。
答案 0 :(得分:1)
使用tidyverse
:
library(tidyverse)
strsplit(names(df1), split="\\.") %>%
map2_dfc(syms(names(df1)),
~ transmute(df2, !!(.y) := apply(df2, 1, function(z) sum(!z %in% .x & !is.na(z))))) %>%
bind_cols(df2, .)
输出:
thing_1 thing_2 thing_3 thing_4 apple.onion.pear apple.banana.onion.pear
1 apple onion <NA> <NA> 0 0
2 onion <NA> <NA> <NA> 0 0
3 pear banana apple <NA> 1 0
4 banana tree pear lobster 3 2
banana.pear
1 2
2 1
3 1
4 2