在R中,查找数据集中的重复日期,并将其关联值替换为其均值

时间:2013-07-03 00:45:17

标签: r

我有一个相当小的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)

然后,通过平均和替换重复日期的距离,我希望对整个数据集执行其他功能。

4 个答案:

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