这可能已经得到了回答,但老实说,如果有的话,我找不到它。
我有数以千万计的成本,患者身份,性别,地区和年龄猫的观察结果。
我需要每人的平均成本(ID),每个唯一身份证号码只有一个成本条目,但有时同一个人会在多个年龄类别或地区中弹出。我需要一段代码来为每个ID用户分配最具代表性的年龄和区域。
例如,ID用户1在一年中有一个生日,并从年龄类别15-24移动到25-34但我想为该用户分配15-24,因为它最能描述他。同样,ID用户3在区域A,D和E中弹出,但我想将E分配给他,因为它是该用户最具代表性的区域。
如果有人可以建议代码将用户行中最常用的值分配给所有这些行,我将不胜感激。我可以自己从那里拿走它。
非常感谢
这是我所拥有的表格,然后是我想要的表格。请注意,个人1也作为女性进入最终观察,所以“三个”#3;此样本需要更改。这在数据集中多次发生。
ID Cost Sex Age Cat Region
1 5.68 M 15-24 A
1 5.63 M 15-24 A
1 5.87 M 15-24 A
1 6.32 M 25-34 A
1 6.45 F 25-34 B
2 2.34 F 65-74 C
2 3.52 F 65-74 C
2 9.85 F 65-74 C
3 7.52 M 35-44 A
3 6.52 M 35-44 D
3 5.32 M 35-44 E
3 2.12 M 35-44 E
ID Cost Sex Age Cat Region
1 5.68 M 15-24 A
1 5.63 M 15-24 A
1 5.87 M 15-24 A
1 6.32 M 15-24 A
1 6.45 M 15-24 A
2 2.34 F 65-74 C
2 3.52 F 65-74 C
2 9.85 F 65-74 C
3 7.52 M 35-44 E
3 6.52 M 35-44 E
3 5.32 M 35-44 E
3 2.12 M 35-44 E
答案 0 :(得分:0)
我认为一般的答案是你想使用像aggregate
或`tapply'这样的函数来使用split-apply模式。这是使用tapply的解决方案:
df <- data.frame(id = c(1,1,1,2,2,3),
f=factor(c('foo','foo','bar','foo','bar','bar')))
df
#> id f
#> 1 foo
#> 1 foo
#> 1 bar
#> 2 foo
#> 2 bar
#> 3 bar
# initialize a data.frame with one record per id
df2 <- data.frame(id = unique(df$id))
# identify the most frequent factor level for each person
tmp <- tapply(df$f, # the variable to be summarized
df$id,# the variable on whith to group the summaries
function(x){
# tabulate the value of F
tbl <- table(x)
# return (the first of) the most frequent value(s)
names(tbl)[which(tbl == max(tbl))[1]]
})
df2$f <- tmp[match(df2$id,names(tmp))]
df2
#> id f
#> 1 1 foo
#> 2 2 bar
#> 3 3 bar
请注意,你必须小心打破关系 - 你会注意到这个例子中返回的'第一个值'是按字母顺序排列的第一个,因为这是因子级别的排序因此表中的排序tbl
...
dplyr
和data.table
解决方案运行得更快,因为它们会在分组变量上创建索引,然后使用这些索引来识别相关的记录集。也就是说,有一个带有> 1.6M记录的数据集会产生两个问题:运行时间和内存。您可能希望使用像function(x)0
之类的简单摘要函数来创建索引的时间基准,然后知道创建索引是订单n*log(n)
您可以计算完整集的运行时间(假如你的内存不足)。
对于此任务,我建议在聚合数据之前使用setkey(DT,id)
使用data.table来索引id列。 data.table包含大量此类任务的示例,包括introductory vignette(请参阅vignette('datatable-intro')
)