在R中有效填充平均值旁边的值

问题描述:

我有一张我需要用平均值填充的表格。我目前正在使用效率低下的代码,这将在大型数据集上花费很长时间。例如:在R中有效填充平均值旁边的值

样本数据:

x = read.table(text="a b value mean 
        1 1 10 0 
        1 1 12 0 
        2 2 14 0 
        2 1 16 0", header=TRUE) 

代码:

y <- aggregate(x$value, list(a = x$a,b = x$b), mean) 
print(y) 
# a b x 
# 1 1 1 11 
# 2 2 1 16 
# 3 2 2 14 

for (i in 1:4) { 
    for (j in 1:3) { 
    if (x$a[i]==y$a[j] && x$b[i]==y$b[j]) { 
     x$mean[i]=y$x[j] } 
    } 
} 
print(x) # This is the final output 
# a b value mean 
# 1 1 1 10 11 
# 2 1 1 12 11 
# 3 2 2 14 14 
# 4 2 1 16 16 

我希望能够从输入到与高效的代码输出来获得。我是R新手,非常感谢您的帮助!

+0

你能解释为什么你觉得它效率低下,你试图让它更高效吗? – dethtron5000

+1

有关提高工作代码效率的问题可能更适合于代码审查(http://codereview.stackexchange.com/) –

merge功能将匹配具有相同名称的列xyab):

x = data.frame(a=c(1, 1, 2, 2), b=c(1, 1, 2, 1), value=c(10, 12, 14, 16)) 
y = aggregate(x$value, list(a=x$a, b=x$b), mean) 
merge(x, y, sort=F) 
# a b value x 
# 1 1 1 10 11 
# 2 1 1 12 11 
# 3 2 2 14 14 
# 4 2 1 16 16 

您正在寻找ave

x <- transform(x, mean = ave(value, a, b, mean)) 

# a b value mean 
# 1 1 1 10 11 
# 2 1 1 12 11 
# 3 2 2 14 14 
# 4 2 1 16 16 

data.table是这样的去:

library(data.table) 
x.dt <- data.table(x[1:3])    # convert first three cols 
x.dt[, mean:=mean(value), by=list(a, b)] # add back mean 
# a b value mean 
# 1: 1 1 10 11 
# 2: 1 1 12 11 
# 3: 2 2 14 14 
# 4: 2 1 16 16 

data.table非常快。