将分类变量重新编码为最常见的值

时间:2015-04-16 15:18:08

标签: r

这可能已经得到了回答,但老实说,如果有的话,我找不到它。

我有数以千万计的成本,患者身份,性别,地区和年龄猫的观察结果。

我需要每人的平均成本(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

1 个答案:

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

dplyrdata.table解决方案运行得更快,因为它们会在分组变量上创建索引,然后使用这些索引来识别相关的记录集。也就是说,有一个带有> 1.6M记录的数据集会产生两个问题:运行时间和内存。您可能希望使用像function(x)0之类的简单摘要函数来创建索引的时间基准,然后知道创建索引是订单n*log(n)您可以计算完整集的运行时间(假如你的内存不足)。

对于此任务,我建议在聚合数据之前使用setkey(DT,id)使用data.table来索引id列。 data.table包含大量此类任务的示例,包括introductory vignette(请参阅vignette('datatable-intro')