按类替换0表示

时间:2015-01-18 17:14:05

标签: r

我想用该列的平均值替换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,以便用平均值替换它们。

4 个答案:

答案 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))