0

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

4 回答 4

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
于 2013-07-03T01:20:36.983 回答
0

除非我误解:

library(plyr)
ddply(z, .(id), summarise, var2 = mean(var))
# id var2
# 1  1    3
# 2  2    2
# 3  3    5
# 4  4    2
于 2013-07-03T13:57:57.100 回答
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

没有必要将唯一值与重复值区别对待,因为单个参数的平均值就是参数。

于 2016-04-20T23:10:24.363 回答
-1
zt<-aggregate(var~id,data=z,mean)
zt
  id var
1  1   3
2  2   2
3  3   5
4  4   2
于 2014-12-12T10:42:15.060 回答