【问题标题】:Remove rows by multiple logical conditions (rstudio)按多个逻辑条件删除行 (rstudio)
【发布时间】:2020-08-18 19:50:11
【问题描述】:

假设这是我的数据框:

df <- data.frame(replicate(10,sample(0:50,20,rep=TRUE)))

S  X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
1   3 26 39 25 24  4 46 42  8  42
2  40  6 50 50 22  2 40 24 26  17
3  32 45 18  7 19  6 33 12  0  13
4   3 45 43 32 16 33 25 18 35  45
5   7 36  2 25 16 20 24 14 27  29
6  45  4 12 13 50 35 38  1 27  34
7  18 43 38 16 34 18 19 45  4  34
8  18  9 33 38 18 13 23 44 41   4
9  28 34  6  3 14 11 47  4 21  50
10  6 48 42 46 48 42 12 33  1  32
11 28 20 37  2 26 33  5  2 22  27
12 40 30 41 45 28  6  5 46 21  46
13  1 47 46 37  0  3 11 45 12  11
14 20  0  9 38 42 15 44  1  2  45
15 49 29 25 41 38 26 20 34 50   0
16  2  5 47  6 36 34 28 36 32  38
17 15 22 50 13 26  9 37 40 41  23
18 44 27 47 37 26 34 31 36 44  12
19 47 41 19  2 50 44 48 36 34  38
20 25 31 28 34  8 19  3 13 14  23

我需要排除 8 列或更多列 (X1:X10) 中值高于 30 的主题 ('S')。也就是说,只排除那些有 8 倍或更多的值高于 30 的人(例如主题 19)。我在想也许'ifelse'函数可能有用,但我真的不知道如何实现它。

非常感谢任何帮助!非常感谢!

【问题讨论】:

  • 我想知道您为什么接受subset(df,rowSums(df &gt; 30)&gt;=8),因为这并没有排除那些“8 倍或更多值高于 30(例如主题 19)”但而是排除所有其他行。要使那段代码排除需要更改的行:subset(df,!rowSums(df &gt; 30) &gt;= 8)。请看一下我的答案,我已经更新并提供了更多解释。

标签: r if-statement filter


【解决方案1】:
df[-which(apply(df, 1, function(x) sum(x > 30) > 8)),]

为了说明它是如何(和那个)工作的,请考虑这个数据框:

set.seed(1111)
df <- data.frame(replicate(5,sample(0:50,5,rep=TRUE)))
df
  X1 X2 X3 X4 X5
1 23 49  0  8  8
2 21 44 38 46 21
3 46  5 38 28 42
4  6 27 32 45 50
5 37  7 44 39  3

这里第二行的值 > 20 超过 4 行。要删除该行,您从df 中减去(-which 中的那些行,值大于 20 的列数大于 4:

df[-which(apply(df, 1, function(x) sum(x > 20) > 4)),]
  X1 X2 X3 X4 X5
1 23 49  0  8  8
3 46  5 38 28 42
4  6 27 32 45 50
5 37  7 44 39  3

等等,第二行已被删除。

【讨论】:

  • 你能解释一下为什么这能解决问题吗?
【解决方案2】:

您可以尝试subset + rowSums 如下所示

subset(df,!rowSums(df > 30)>=8)

【讨论】:

  • 嗨!由于我的真实数据框有多个名称不同的列,因此我选择了需要应用过滤器的列:a 30)>=8),我怎样才能删除它们而不是保留它们?
  • subset(df,!rowSums(df &gt; 30) &gt;= 8)
  • @ChrisRuehlemann 很抱歉我错过了!。我修好了,谢谢!
  • @AnabelaCantiani 我之前的回答有误,所以请检查我的更新。
  • @AnabelaCantiani 我不确定你是否想使用subset(df[-c(29:32,51:54,73:76)], !rowSums(df[c(29:32,51:54,73:76)] &gt;30) &gt;=8)
猜你喜欢
  • 2011-09-08
  • 2021-01-16
  • 1970-01-01
  • 2022-01-10
相关资源
最近更新 更多