R - 选择值满足条件的行

时间:2016-04-21 17:52:22

标签: r dataframe

我有一个名为df的数据框,我想要做的是选择该行中满足某些条件n的值至少为c的所有行。

例如,我想要来自df的行,使得行中至少50%的值(或列)大于0.75。

以下是我想出来实现这一目标的原因:

test <- df[apply(df, 1, function(x) (length(x[x > 0.75]) / length(x) > 0.5)]

很遗憾,我收到此错误消息:

Error in `[.data.frame`(df, apply(df,  : 
  undefined columns selected

我对R来说很新,所以我在这一点上非常困难,这里的问题是什么?

2 个答案:

答案 0 :(得分:2)

您收到该错误消息,因为您尚未告知R要在子集中包含哪些列。

你有:

df[your_apply_function]

其中没有指定哪些列。相反,你应该尝试

df[your_apply_function, ]

对于与此apply函数的结果匹配的所有行,以及所有列',这意味着'子'df'。编辑:我认为这也无效。

但是,我会使用dplyr

来接近它
library(dplyr)
rowcounts <- apply(df, 1, function(x) rowSums(x > 0.75))
df <- bind_cols(df, rowcounts)
df <- filter(df, rowcounts > ncol(df)/2)

我还没有测试这个(代码仍然在我的机器上运行),但它看起来是正确的。当我有机会时,我会测试它。

答案 1 :(得分:1)

这可以通过与0.75,rowSums()进行逐步比较,然后对0.5进行矢量化比较来实现:

set.seed(3L); NR <- 5L; NC <- 4L; df <- as.data.frame(matrix(rnorm(NR*NC,0.75,0.1),NR));
df;
##          V1        V2        V3        V4
## 1 0.6538067 0.7530124 0.6755218 0.7192344
## 2 0.7207474 0.7585418 0.6368781 0.6546983
## 3 0.7758788 0.8616610 0.6783642 0.6851757
## 4 0.6347868 0.6281143 0.7752652 0.8724314
## 5 0.7695783 0.8767369 0.7652046 0.7699812
df[rowSums(df>0.75)/ncol(df)>=0.5,];
##          V1        V2        V3        V4
## 3 0.7758788 0.8616610 0.6783642 0.6851757
## 4 0.6347868 0.6281143 0.7752652 0.8724314
## 5 0.7695783 0.8767369 0.7652046 0.7699812

这适用于矩阵和data.frames。

相关问题