r - R:计算一系列列中列名中的文本不匹配
问题描述
我有一组名称由多个项目组成的列,类似于:
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,因为“apple”thing_1
和“onion”thing_2
都出现在列名中,并且 NA 不会导致不匹配。第 3 行的值为 1,因为thing_2
是“香蕉”,它没有出现在列名中,所有其他项目要么是 NA,要么可以在列名中找到。
到目前为止,我一直在使用grepl()
,但我很难过!任何帮助将非常感激。
解决方案
与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
推荐阅读
- java - 如何将我自己的图片添加到android背景
- python - “SyntaxError: invalid syntax” 总是在带有 micro:bit 的 REPL 模式下显示在 mu-editor 上
- python - Django - 使用 pk_url_kwarg 选择性地查询模型
- amazon-web-services - Amazon SES 从 000-dsds-dss@amazonses.com 发送电子邮件,而不是配置的域
- python - 身份验证 OneDrive API Python
- docker - 如何控制 docker 确定磁盘空间是否“可回收”的方式?
- android - 如何使用按钮参数创建警报对话框的方法?
- c# - c#依赖注入无法将lambda转换为预期的委托
- ruby-on-rails - How to use gem cryptocompare in ruby on rails?
- javascript - 修改 VueJS 合并策略以优先考虑来自 mixin 的模板