我有一个名为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来说很新,所以我在这一点上非常困难,这里的问题是什么?
答案 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。