我有一个相当小的3列数据集(id,日期和距离),其中某些日期可能会重复(否则是唯一的),因为有一个与该日期相关的第二个距离值。
对于那些重复的日期,我如何平均距离然后用平均值替换原始距离?
让我们使用这个数据集作为模型:
z <- data.frame(id=c(1,1,2,2,3,4),var=c(2,4,1,3,5,2))
# id var
# 1 2
# 1 4
# 2 1
# 2 3
# 3 5
# 4 2
id#1的平均值为3,id#2的平均值为2,然后将替换每个原始var。
我已经检查了多个问题来解决这个问题,并找到了相关的讨论。结果,到目前为止我的目标是:
# Check if any dates have two estimates (duplicate Epochs)
length(unique(Rdataset$Epoch)) == nrow(Rdataset)
# if 'TRUE' then each day has a unique data point (no duplicate Epochs)
# if 'FALSE' then duplicate Epochs exist, and the distances must be
# averaged for each duplicate Epoch
Rdataset$Distance <- ave(Rdataset$Distance, Rdataset$Epoch, FUN=mean)
Rdataset <- unique(Rdataset)
然后,通过平均和替换重复日期的距离,我希望对整个数据集执行其他功能。
答案 0 :(得分:1)
这是一个无需实际检查id
是否重复的解决方案 - 您实际上并不需要这样做,因为对于非重复的id
,您可以使用单var
值的平均值:
duplicated_ids = unique(z$id[duplicated(z$id)])
library(plyr)
z_deduped = ddply(
z,
.(id),
function(df_section) {
res_df = data.frame(id=df_section$id[1], var=mean(df_section$var))
}
)
输出:
> z_deduped
id var
1 1 3
2 2 2
3 3 5
4 4 2
答案 1 :(得分:0)
除非我误解:
library(plyr)
ddply(z, .(id), summarise, var2 = mean(var))
# id var2
# 1 1 3
# 2 2 2
# 3 3 5
# 4 4 2
答案 2 :(得分:0)
这是data.table
风格的另一个答案:
library(data.table)
z <- data.table(id = c(1, 1, 2, 2, 3, 4), var = c(2, 4, 1, 3, 5, 2))
z[, mean(var), by = id]
id V1
1: 1 3
2: 2 2
3: 3 5
4: 4 2
没有必要以不同于重复值的方式处理唯一值,因为单个参数的平均值是参数。
答案 3 :(得分:-1)
zt<-aggregate(var~id,data=z,mean)
zt
id var
1 1 3
2 2 2
3 3 5
4 4 2