按组计算级别
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个级别。
我想要的结果是按 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")
我们可以从@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
我有一个关于检查哪个级别最多的问题。
这是我的数据:
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")
我们可以从@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