我有一个看起来像这样的data.frame:
Col1 Col2 Col3 Mean
5 6 5 5.3
3 7 9 6.3
1 3 4 2.6
我想逐行删除与每行的平均值不同的数字,并用剩余的两个数字重新计算平均值。
有人能帮帮我吗?
提前致谢
答案 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
列,使用条件filter
,spread
生成的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))