在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新手,非常感谢您的帮助!
答
的merge
功能将匹配具有相同名称的列x
和y
(a
和b
):
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
非常快。
你能解释为什么你觉得它效率低下,你试图让它更高效吗? – dethtron5000
有关提高工作代码效率的问题可能更适合于代码审查(http://codereview.stackexchange.com/) –