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