【问题标题】:Subset dataframe such that all values in each row are less than a certain value子集数据框,使得每行中的所有值都小于某个值
【发布时间】:2015-01-27 21:30:32
【问题描述】:

我有一个包含维度列和 4 个值列的数据框。如何对列进行子集化,以使每条记录的所有 4 列都小于给定的 x?我知道我可以使用子集手动执行此操作并为每列指定条件,但是有没有办法使用可能的应用函数来执行此操作? 下面是一个示例数据框。例如,假设 x 为 0.7。在这种情况下,我想消除该行的任何列大于 0.7 的任何行)。

   zips ABC DEF GHI JKL
1     1 0.8 0.6 0.1 0.6
2     2 0.1 0.3 0.8 1.0
3     3 0.5 0.1 0.4 0.8
4     4 0.6 0.4 0.2 0.3
5     5 1.0 0.8 0.6 0.5
6     6 0.2 0.7 0.3 0.4
7     7 0.3 1.0 1.0 0.2
8     8 0.7 0.9 0.5 0.1
9     9 0.9 0.5 0.9 0.7
10   10 0.4 0.2 0.7 0.9

以下功能似乎有效,但有人可以解释这里的逻辑吗?

Variance_Percentile[!rowSums(Variance_Percentile[-1] > 0.7), ]
  zips ABC DEF GHI JKL
4    4 0.6 0.4 0.2 0.3
6    6 0.2 0.7 0.3 0.4

【问题讨论】:

  • 我认为这会将数据帧子集化,并且只保留列总和小于 0.7 的行。我不想走太远。我想保留所有列小于 0.7 的所有行
  • 请显示示例数据的结果
  • 嗯,确实有效?你能解释一下这里发生了什么吗?我认为 rowSums 会总结每一行?
  • 刚刚添加了它的功能

标签: r dataframe apply


【解决方案1】:

您可以对子集使用否定的rowSums()

df[!rowSums(df[-1] > 0.7), ]
#   zips ABC DEF GHI JKL
# 4    4 0.6 0.4 0.2 0.3
# 6    6 0.2 0.7 0.3 0.4
  • df[-1] > 0.7 为我们提供了一个逻辑矩阵,告诉我们哪些 df[-1] 大于 0.7
  • rowSums() 对这些行求和(每个 TRUE 值等于 1,FALSE 为零)
  • ! 将这些值转换为逻辑值并将它们取反,以便我们得到任何为零的行总和(FALSE)并将它们变为 TRUE。换句话说,如果 rowSums() 结果为零,我们需要这些行。
  • 我们使用该逻辑向量作为行子集

获得相同逻辑向量的另一种方法是做

rowSums(df[-1] > 0.7) == 0

【讨论】:

    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 2018-07-18
    • 2019-10-11
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    相关资源
    最近更新 更多