【问题标题】:Filtering a data frame based on multiple columns sharing a name基于共享名称的多个列过滤数据框
【发布时间】:2018-06-17 13:17:49
【问题描述】:

我现在已经使用 R 工作了几个月,但我仍然认为自己是 R 的初学者。感谢这个社区,我已经学到了很多关于 R 的知识。对此我感激不尽。

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

和这个问题有关:filtering data frame based on NA on multiple columns

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

这里是一个简化的例子:

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 

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

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

有没有一种简单的方法,可以将条件应用于共享同一个名称的多个列,而无需一一指定?

【问题讨论】:

    标签: r dataframe filter conditional-statements


    【解决方案1】:

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

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

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

    【讨论】:

    • 我知道这不会那么难。我真的没有考虑过使用 rowSums 来应用单个条件。我非常关注这些专栏的内容,以至于我错过了,我可以只计算我感兴趣的专栏并将结果与​​我的预期进行比较。非常感谢您的帮助...这真是令人大开眼界。我打勾并感谢您的注意。我经常将东西命名为“数据”。也许我将来应该改变它。
    • 不客气。是的,用预定义函数命名对象基本上是在找错误
    猜你喜欢
    • 2021-02-02
    • 2022-07-30
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多