有条件地删除数字并计算摘要统计数据

时间:2017-02-06 17:12:04

标签: r

我有一个看起来像这样的data.frame:

 Col1       Col2     Col3     Mean    
   5         6        5        5.3     
   3         7        9        6.3    
   1         3        4        2.6      

我想逐行删除与每行的平均值不同的数字,并用剩余的两个数字重新计算平均值。

有人能帮帮我吗?

提前致谢

3 个答案:

答案 0 :(得分:4)

可以像dplyr/tidyr这样完成: 生成有问题的数据框:

df<-data.frame(Col1=sample(1:10,3),Col2=sample(1:10,3),Col3=sample(1:10,3))%>%mutate(Mean=rowMeans(.))

例如:

>df
  Col1 Col2 Col3     Mean
1    6   10    3 6.333333
2    7    6    1 4.666667
3    9    4    4 5.666667

然后gather列,使用条件filterspread生成的tbl_df为原始格式,select除了均值列之外的所有内容并重新计算{{1} }}:

rowMeans

这会给你:

df_fin<-df%>%gather(Cols,value,Col1:Col3)%>%filter(value>Mean)%>%spread(Cols, value)%>%select(-Mean)%>%mutate(newMean=rowMeans(.,na.rm=TRUE))

答案 1 :(得分:3)

我们可以设置前3列中大于&#39;平均值的元素。列到&#39; NA&#39;,然后根据新值重新计算行的平均值(rowMeans)并将其分配给&#39; Mean&#39;柱

df1[1:3][df1[1:3] > df1$Mean] <- NA
df1$Mean <- rowMeans(df1[1:3], na.rm = TRUE)

或单行

df1$Mean <- rowMeans(replace(df1[1:3], df1[1:3] > df1$Mean, NA), na.rm = TRUE)

或者@Alexey Ferapontov提到,逻辑可能不同

df1[cbind(1:nrow(df1), max.col(df1[1:3]- df1$Mean, "first"))] <- NA
rowMeans(df1[1:3], na.rm = TRUE)

答案 2 :(得分:1)

数据

df = read.csv(text = "Col1,Col2,Col3,Mean
                      5,6,5,5.3
                      3,7,9,6.3
                      1,3,4,2.6", header = TRUE)

删除距离行平均值最远的每行的值并创建新的数据框

df2 = t(apply(df[,1:3], 1, function(x) x[-which.max(abs(x-mean(x)))]))

rowMeans

中的行计算df2
df2 = cbind(df2,Mean = rowMeans(df2))