通过循环将功能应用于列时删除一行

时间:2019-04-26 14:05:36

标签: r

set.seed(1234)
df <- data.frame(
    cola = runif(10, min=0, max=100),
    colb = runif(10, min=0, max=100),
    colc = runif(10, min=0, max=100))
df

以上脚本的输出为:

         cola     colb      colc
1  11.3703411 69.35913 31.661245
2  62.2299405 54.49748 30.269337
3  60.9274733 28.27336 15.904600
4  62.3379442 92.34335  3.999592
5  86.0915384 29.23158 21.879954
6  64.0310605 83.72956 81.059855
7   0.9495756 28.62233 52.569755
8  23.2550506 26.68208 91.465817
9  66.6083758 18.67228 83.134505
10 51.4251141 23.22259  4.577026

我的目的:如果one cell value < mean(column)+10,我将删除整个row
例如,
row 1df[1,'cola'] <mean(df$cola)中,row 1将被删除。
row 2中,由于df[2,'colc'] <mean(df$colc),因此row 2将被删除。

最后,预期结果是:

      cola     colb      colc
6    64.0310605 83.72956 81.059855

我可以使用subset(df,cola>mean(cola)+10 & colb>mean(colb)+10 & colc>mean(colc)+10)来获得期望的结果,但是当数据帧中有数百列时,这不是一个明智的方法。

似乎应该使用apply系列函数。我该怎么做?
预先感谢!

3 个答案:

答案 0 :(得分:1)

使用apply(这可能很慢):

Res<-as.data.frame(apply(df,2,function(x) ifelse(x<mean(x)+10,0,x)))
Res[!apply(Res,1,function(x) any(x==0)),]

结果:

cola     colb     colc
6 64.03106 83.72956 81.05986

答案 1 :(得分:0)

使用colMeans获取每一列的均值,然后遍历每一行,将每个值与其均值进行比较(使用sapply),最后,选择所有结果为TRUE的行(使用{{1 }}。

[

答案 2 :(得分:0)

使用rowSumscolMeans的单线解决方案

df[rowSums(df < (colMeans(df) + 10)) == 0, ]
#      cola     colb     colc
#6 64.03106 83.72956 81.05986

或者使用dplyrfilter_all的{​​{1}}版本

all_vars