R:计算一系列列中列名称内的文本不匹配

问题描述 投票:1回答:1

我有一组列,其名称由多个项组成,类似于:

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'))

对于每个以项目列表命名的列,我希望计算列名称中不存在的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))

enter image description here

作为逻辑的简要说明:

对于apple.onion.pear列,第1行为0,因为thing_1中的“apple”和thing_2中的“onion”都出现在列名称中,并且NAs不会导致不匹配。第3行的值为1,因为thing_2是“banana”,它没有出现在列名中,所有其他项都是NA或者可以在列名中找到。

到目前为止,我一直在与grepl()合作,但我很难过!任何帮助将非常感激。

r string grepl
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.