根据共享名称

时间:2018-01-08 14:29:58

标签: r dataframe filter grep conditional-statements

我现在和R一起工作了几个月,仍然认为自己是R的初学者。感谢这个社区,我已经学到了很多关于R的知识。我不能为此感谢你。

现在,我有一个问题,不知何故总会在某些时候回到我身边并且在本质上是如此基本以至于我有这种感觉,我自己应该已经在某个时候解决了它。

与此问题有关:filtering data frame based on NA on multiple columns

我有一个data.frame,其中包含名称中包含特定字符串(例如“type”)的可变数量的列。

这是一个简化的例子:

data <- data.frame(name=c("aaa","bbb","ccc","ddd"), 
                   'type_01'=c("match", NA, NA, "match"),
                   'type_02'=c("part",NA,"match","match"),
                   'type_03'=c(NA,NA,NA,"part"))

> data
name type_01 type_02 type_03
1  aaa   match   part     <NA>
2  bbb    <NA>    <NA>    <NA>
3  ccc    <NA>   match    <NA>
4  ddd   match   match    part

好的,我知道可以使用...

过滤列
which(is.na(data$'type_01') & is.na(data$'type_02') & is.na(data$'type_03'))
[1] 2

但由于我的数据中类型列的数量是可变的(有时最多20个),我宁愿用类似的东西来获取它们......

grep("type", names(data))
[1] 2 3 4 

...并将条件应用于所有列,而不单独指定。

在这里的示例中,我正在寻找NAs,但情况可能并非总是如此。

是否有一种简单的方法,将条件应用于多个共享通用名称的列而不是逐个指定它们?

1 个答案:

答案 0 :(得分:1)

您无需循环或应用任何内容。继续使用grep方法,

i1 <- grep("type", names(a))
which(rowSums(is.na(a[i1])) == length(i1))
#[1] 2

注意我将您的数据框重命名为a,因为data已被定义为R中的函数