我有一个关于检查哪个级别最多的问题 这是我的数据:
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个级别
我想要的结果是按Year
和Area
分组。此外,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")
答案 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