r - 按组计算级别

标签 r data.table data-manipulation

我有一个关于检查哪个级别最高的问题。
这是我的数据:

Year  Area    V1    V2    V3
2014  USA    100    25    50
2014  USA    200    50    60
2014  USA    200    50    50
2014  USA    200    50    50
2014  USA    300    75    40
2014  ASIA   100    25    60
2014  ASIA   100    25    70
2014  ASIA   300    75    60
2014  ASIA   400    100   60
2014  ASIA   500    125   70
2015  USA    100    25    80
2015  USA    300    75    80
2015  USA    300    75    70
2015  USA    300    75    90
2015  USA    500    125   40
2015  ASIA   400    100   90
2015  ASIA   400    100   80
2015  ASIA   300    75    80
2016  USA    500    125   60
2016  USA    500    125   60
2016  ASIA   100    25    50

我想要的是:

Year  Area   V1    V2    V3   Count
2014  USA    200   50    50   5
2015  USA    300   75    80   5
2016  USA    500   125   60   2
2014  ASIA   100   25    60   5
2015  ASIA   400   100   80   3
2016  ASIA   100   25    50   1

V1中,有5个级别(100、200、300、400和500)。
V2中,也有5个级别,分别是0.25*V1
V3中,有6个级别。
我想要的结果是按 YearArea 分组的。此外,V1 是最大级别数。例如,在 Year == 2014Area == USA 中,V1 包含 1 个级别 100、3 个级别 200 和 1 个级别 300。所以,结果应该是 200,因为它是最多的。 V2V3 相同。

有什么想法吗?

数据

dt <- fread("Year  Area    V1    V2    V3
2014  USA    100    25    50
2014  USA    200    50    60
2014  USA    200    50    50
2014  USA    200    50    50
2014  USA    300    75    40
2014  ASIA   100    25    60
2014  ASIA   100    25    70
2014  ASIA   300    75    60
2014  ASIA   400    100   60
2014  ASIA   500    125   70
2015  USA    100    25    80
2015  USA    300    75    80
2015  USA    300    75    70
2015  USA    300    75    90
2015  USA    500    125   40
2015  ASIA   400    100   90
2015  ASIA   400    100   80
2015  ASIA   300    75    80
2016  USA    500    125   60
2016  USA    500    125   60
2016  ASIA   100    25    50")

最佳答案

我们可以从@KenWilliam's answer here获取Mode函数.

library(data.table)
Mode <- function(x) {
  ux <- unique(x)
  ux[which.max(tabulate(match(x, ux)))]
 }

按“年份”、“区域”分组(使用 data.table 语法,因为它已经是使用 fread 读取的 data.table >),循环遍历data.table的子集(.SD),使用Mode获取频率最高的元素,同样使用获取列的频率>table,求出总和,通过取每行的最大值 (pmax) 并连接 (c )以及“Mode”列的列表

dt[, c(lapply(.SD, Mode), 
     Count = do.call(pmax, lapply(.SD, function(x) sum(table(x))))), by = .(Year, Area)]
#    Year Area  V1  V2 V3 Count
#1: 2014  USA 200  50 50     5
#2: 2014 ASIA 100  25 60     5
#3: 2015  USA 300  75 80     5
#4: 2015 ASIA 400 100 80     3
#5: 2016  USA 500 125 60     2
#6: 2016 ASIA 100  25 50     1

关于r - 按组计算级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46520985/

相关文章:

python - 展平具有类型列表值的列,同时在 Pandas 中相应地复制另一列的值

R——从函数 "polyroot"() 和 "Im()"中查找非复杂解

r - 是否有 R 包来解析地球物理 "Log Ascii Standard"文件(.las 文件)?

r - 将列表中的元素 x 到 y 粘贴在一起

r - 将函数应用于数据表子集,不包括按值嵌套

R:自动在文本前后添加引号

r - 如何通过将相同的值写入同一行,将两个不同长度的向量写入一个数据帧?

r - 根据日期范围合并多个数据框

使用 .SD 时的 R data.table 慢聚合

python - R/ python : Converting PDF's To Tables