【问题标题】:count the levels by groups按组计算级别
【发布时间】:2018-03-13 06:10:31
【问题描述】:

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

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 个级别。
我想要的结果是按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")

【问题讨论】:

  • 特别适用于 V2 和 V3!如果我们只在年份/区域内保留 V1 的模式,为什么不删除它们?

标签: r data.table data-manipulation


【解决方案1】:

我们可以从@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语法,因为它已经是data.table,通过fread读取),遍历data.table的子集(.SD),得到使用Mode 具有最高频率的元素,类似地使用table 获取列的频率,找到sum,通过取每行的最大值(pmax)将多列折叠为一个并连接(c) 与“模式”列的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

【讨论】:

  • 如果我的数据有其他列,代码包括它们。如果不考虑姓名、年龄等其他列,我该如何处理。
  • @PeterChen 在这种情况下,请指定.SDcols中的列
【解决方案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

但正如 cmets 中所述,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

【讨论】:

  • 太棒了。但实际上您不需要删除V2V3。我也需要它们。这是dplyr 解决方案。但是如果我的数据非常大,data.table 一定会更快。
猜你喜欢
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 2019-10-10
  • 1970-01-01
  • 2020-10-04
  • 1970-01-01
  • 2018-07-09
  • 2016-12-09
相关资源
最近更新 更多