【问题标题】:Removing rows that has 0's across multiple colum by retaining grouping variable通过保留分组变量删除多列中包含 0 的行
【发布时间】:2019-12-16 15:36:54
【问题描述】:

我有一个所有列都为零的数据集。我需要删除有零的行。但我想保留其他行。另外,我不想破坏分组变量。

Participant  Media B     C     D
A1           C11   0.5   0     0
A1           C12   0.4   0.3   0
A1           C13   0     0     0
A2           C11   0     0     0
A2           C12   1     2     0
A2           C13   2     0     0

我在dplyr 中应用了多重过滤功能。它对我的数据集没有帮助。

data <- data%>%
        filter(data, B > 0 & C > 0 & D >0)

有没有什么快速的方法可以在不破坏数据框的情况下对数据进行子集化?

预期输出

Participant  Media B     C     D
A1           C11   0.5   0     0
A1           C12   0.4   0.3   0
A2           C12   1     2     0
A2           C13   2     0     0

【问题讨论】:

  • 您是否要求删除BCD 中至少有 1 个零值的所有行?还是所有值?
  • 试试df[rowSums(df[-c(1:2)] == 0) != ncol(df[-c(1:2)]),]
  • 谢谢@Sotos。 akash87 - 我只想删除其中只有 0 的行。

标签: r dplyr tidyr


【解决方案1】:

我们可以使用filter_at

library(dplyr)
data %>%
   filter_at(vars(B:D), any_vars(. != 0))
#  Participant Media   B   C D
#1          A1   C11 0.5 0.0 0
#2          A1   C12 0.4 0.3 0
#3          A2   C12 1.0 2.0 0
#4          A2   C13 2.0 0.0 0

数据

data <- structure(list(Participant = c("A1", "A1", "A1", "A2", "A2", 
"A2"), Media = c("C11", "C12", "C13", "C11", "C12", "C13"), B = c(0.5, 
0.4, 0, 0, 1, 2), C = c(0, 0.3, 0, 0, 2, 0), D = c(0L, 0L, 0L, 
0L, 0L, 0L)), class = "data.frame", row.names = c(NA, -6L))

【讨论】:

  • 非常感谢。这有助于我删除不需要的行并保留其余行。
【解决方案2】:

也许你可以试试下面的代码

subset(data,rowSums(data[-(1:2)])!=0)

这样

> subset(data,rowSums(data[-(1:2)])!=0)
  Participant Media   B   C D
1          A1   C11 0.5 0.0 0
2          A1   C12 0.4 0.3 0
5          A2   C12 1.0 2.0 0
6          A2   C13 2.0 0.0 0

【讨论】:

  • 如果两列中有一个 +1 和一个 -1 会不会失败?
  • 感谢您的回答@ThomasIsCoding。
猜你喜欢
  • 2022-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-23
  • 2017-05-10
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多