我想用该列的平均值替换0值(对于同一个类)。例如
a1 class
0 0
1 0
3 0
0 1
1 1
5 1
应转换为
a1 class
2 0
1 0
3 0
3 1
1 1
5 1
现在,我能够找到平均值,但无法选择相同类别的0,以便用平均值替换它们。
答案 0 :(得分:2)
你可以尝试
library(data.table)
setDT(df)[,.(a1=replace(a1, a1==0, mean(a1[a1!=0]))) , class]
答案 1 :(得分:1)
在最初误读了这个问题之后,这里是基数R中的一个冗长选项:
df <- do.call(rbind, lapply(split(df, df$class), function(d) {
d$a1[d$a1 == 0] <- mean(d$a1[d$a1 != 0]); d
}))
rownames(df) <- NULL # to turn the rownames to normal numbering
一些解释:
split(df, df$class)
将数据拆分为具有相同class
的数据块到列表中lapply
,您可以为每个列表元素执行,由d
表示:子列a1,其中a1为0,并将值替换为a1的均值,其中a1不为0 do.call(rbind, ...)
将其重新转换为data.frame 答案 2 :(得分:1)
如果这是您的输入数据框
dd<-data.frame(
a1 = c(0L, 1L, 3L, 0L, 1L, 5L),
class = c(0L, 0L, 0L, 1L, 1L, 1L)
)
您可以使用ave
。例如
dd$a1 <- with(dd, ave(a1, class,
FUN=function(x) ifelse(x==0, mean(x[x!=0]), x)))
答案 3 :(得分:1)
或者
library(dplyr)
df %>%
group_by(class) %>%
mutate(a1 = ifelse(a1 == 0, mean(a1[a1 != 0]), a1))