按组计算级别

时间:2017-10-02 07:16:40

标签: 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 * V1V3中,有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")

2 个答案:

答案 0 :(得分:2)

我们可以从@KenWilliam's answer here获取Mode功能。

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

按“年份”,“区域”(使用data.table语法分组,因为它与data.table一起读取时已经是fread),循环遍历data.table的子集({ {1}}),使用.SD获取频率最高的元素,同样使用Mode获取列的频率,找到table,将多列折叠为单个列通过取每行的最大值(sum)并连接(pmax)与'Mode'的c

list

答案 1 :(得分:2)

使用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