【发布时间】:2017-05-02 15:07:28
【问题描述】:
我有一个数据框 (df),其中包含 4 列值(V1 到 V4 列),我需要根据另外两列(最大和最小列)来选择这些值。我的目标是将 NA 分配给每行的 max 和 min 列设置的范围之外的值,并计算剩余值的平均值。
V1 V2 V3 V4 max min
1 3 6 8 7 5
23 30 5 17 30 16
预期的输出是:
V1 V2 V3 V4 max min mean
NA NA 6 NA 7 5 6
23 30 NA 17 30 16 35
到目前为止,我只能通过使用以下脚本来分配 NA 来做到这一点...
df$V1 <- ifelse(df$V1 > df$max | df$V1 < df$min, NA, df$V1)
df$V2 <- ifelse(df$V2 > df$max | df$V2 < df$min, NA, df$V2)
df$V3 <- ifelse(df$V3 > df$max | df$V3 < df$min, NA, df$V3)
df$V4 <- ifelse(df$V4 > df$max | df$V4 < df$min, NA, df$V4)
...然后以下计算平均值:
df$mean <- rowMeans(df[, 1:4], na.rm = TRUE)
问题是实际数据中的列数会远大于 4,而且这种方法似乎需要太多的重复。在 R 中有没有更好的方法来做到这一点?
我尝试使用data.table 对有效值进行子集化,然后使用apply 函数但没有成功:
df <- df[df[,1:4] <= df$max | df[,1:4] >= df$min, ]
apply(df[,1:4], 1, function(x) mean(x))
谢谢。
【问题讨论】:
-
看
melt。
标签: r