R 按组计算水平

R 按组计算水平,r,data.table,data-manipulation,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

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

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个级别。
我想要的结果是按
年份
地区
分组。此外,
V1
是级别的最大计数。例如,在
Year==2014
Area==USA
中,
V1
包含1个100级、3个200级和1个300级。因此,结果应该是200,因为它是最多的一个
V2
V3
是相同的

有什么想法吗

资料

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")

dt我们可以从中获得
模式
函数


使用
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!如果我们只在年/区域内保留V1模式,为什么不删除它们?太好了。但实际上您不需要删除
V2
V3
。我也需要它们。这是
dplyr
解决方案。但是如果我的数据非常大,
data.table
必须更快。如果我的数据有其他列,则代码会包含它们。我如何处理而不考虑其他列,如名称、年龄等等。@ PeterChen,在这种情况下,指定<代码>中的列。SDCOLs < /代码>
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
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