按组计算级别

count the levels by groups

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

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)))]
 }

按'Year'、'Area'分组(使用data.table语法,因为它已经是fread读取的data.table),遍历子集data.table (.SD) 的元素,使用 Mode 获取频率最高的元素,类似地使用 table 获取列的频率,找到 sum,通过取每行的最大值 (pmax) 并将 (c) 与 'Mode'[=24= 的列的 list 连接起来,将多列合并为一列]

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

使用dplyr我们可以:

dt %>% 
  # we count the number of item within Year x Area groups
  group_by(Year, Area) %>% 
  mutate(Count=n()) %>% 
  # now we count the number of V1 levels within the Year x Area groups
  group_by(Year, Area, V1) %>% 
  mutate(Count_V1=n()) %>% 
  arrange(desc(Count_V1)) %>% 
  # now we come back to Year x Area grouping and retain the most abundant entry
  group_by(Year, Area) %>% 
  slice(1) %>% 
  ungroup() %>% 
  # cosmetics
  arrange(Area, Year) -> dt2

这导致:

dt2
# A tibble: 6 x 7
    Year   Area    V1    V2    V3 Count Count_V1
<int> <fctr> <int> <int> <int> <int>    <int>
1  2014   ASIA   100    25    60     5        2
2  2015   ASIA   400   100    90     3        2
3  2016   ASIA   100    25    50     1        1
4  2014    USA   200    50    60     5        3
5  2015    USA   300    75    80     5        3
6  2016    USA   500   125    60     2        2

但正如评论中所述,V2 和 V3 值令人困惑,因为它们不是基于明确的标准。据我了解,它们可以被删除,就像 Count_V1:

dt2 %>% select(-Count_V1, -V2, -V3)

# A tibble: 6 x 4
   Year   Area    V1 Count
<int> <fctr> <int> <int>
1  2014   ASIA   100     5
2  2015   ASIA   400     3
3  2016   ASIA   100     1
4  2014    USA   200     5
5  2015    USA   300     5
6  2016    USA   500     2