【问题标题】:Subsetting columns with apply function in R using multiple criteria使用多个条件在 R 中使用应用函数对列进行子集化
【发布时间】:2018-07-15 21:44:46
【问题描述】:

我可以通过两个动作完成我的子集化,但想学习如何在一个动作中完成。

我想保留所有行并排除所有为 NA 的列并排除所有为零的行。

例子:

x1 <- 1:10
x2 <- round(rnorm(10, mean=3, sd = 1), 0)
x <- cbind(x1, x2, x3 = 0, x4 = NA)
x

x1 x2 x3 x4
1  2  0 NA
2  5  0 NA
3  2  0 NA
4  5  0 NA
5  3  0 NA
6  3  0 NA
7  2  0 NA
8  5  0 NA
9  3  0 NA
10  3  0 NA

xsub <- x[,apply(x, 2, function (x) !all(is.na(x)))] #excludes cols with all NAs
xsub <- xsub[,apply(xsub, 2, function(x) !all(x==0))] #excludes cols with all zeros

我尝试过使用 | (或)在函数语句中,没有任何反应。语法错误?也只是学习函数。

xsub <- x[,apply(x, 2, function(x) !all(x==0) | !all(is.na(x)))]

我不知道如何使用子集来调用具有这些值的所有列,只是具有特定值的列。

【问题讨论】:

  • @braaterAfrikaaner:关注问题的内容并提供有用的贡献。我有目的地选择了这个词。此版本不再表明我在发帖前已尽职尽责,这通常是关闭线程或向画廊征求刻薄、无益的 cmets 的原因。
  • 我的编辑得到了两位版主的批准,确认它是有用的。说您阅读了其他问题本身并不表明您已尽职尽责,即这句话并没有降低您的问题被关闭的可能性。如果您可以为您阅读的内容提供更多颜色以及为什么它没有帮助,这只会很有用。如有疑问,请简明扼要。

标签: r dplyr subset apply


【解决方案1】:
x[,which(colSums(x)>0)]
      x1 x2
 [1,]  1  3
 [2,]  2  4
 [3,]  3  3
 [4,]  4  4
 [5,]  5  3
 [6,]  6  4
 [7,]  7  2
 [8,]  8  4
 [9,]  9  4
[10,] 10  3

【讨论】:

  • 谢谢你,Onyambu。我不认为这也是摆脱 NA 的一种方式!
  • 如果这解决了问题,您可以点对勾接受,这样其他人也可以从中受益
  • 刚刚用我的数据集尝试过,我得到了一个错误(colsums(x)中的错误:'x'必须是数字。有些列是因子(所有NA),有些是数字(全零)。
  • 那是矩阵吗?因为矩阵只有一种类型。也许你确实有一个数据框。你可以试试is.na(x),看看它是否会给你TRUE?也许NA 是字符。
  • 它是一个数据框。对于具有 NA 的列,我得到 TRUE。具有所有 NA 的列已被标识为类“逻辑”,而不是 R 中的“字符”。一些列应该是因子(区号),而其他列应该是整数(计数)。
【解决方案2】:

如果数据框全是数字,则 Onyambu 的解决方案有效。

这一行代码对我有用。

xsub <- x[,apply(x, 2, function(x) !all(is.na(x)) & !all(x==0))]

“&”的处理方式类似于包含性“或”语句。 它显示:在数据框 (x) 中,取所有不全为 NA (!all(is.na(x)) 或不全为零 (!all(x==0) 的列 (2)。希望这会有所帮助.

如果您有更优雅或更简单的解决方案,请发布。

【讨论】:

    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 2020-07-05
    • 2023-02-26
    • 1970-01-01
    相关资源
    最近更新 更多