【问题标题】:Spread key with two variables具有两个变量的扩展键
【发布时间】:2019-08-04 15:05:57
【问题描述】:

我需要使用两个变量来扩展一个数据框,但我不能使用 tidyr 包来做到这一点。 在我的示例中,我想将月份变量添加到键中,例如 key = c("level", "month")

我做了什么:

library(tidyr)
library(dplyr)

set.seed(123)

name <- sample(letters[1:5], 10, replace = T)
level <- sample(1:3, 10, replace = T)
month <- sample(1:12, 10, replace = T)

df <- data.frame(name, level, month)

df  %>% 
  group_by(name, month, level) %>%
  summarise(n = n()) %>% 
  ungroup() %>% 
  spread(., level, n, sep = "_")

谢谢

【问题讨论】:

  • 你能展示一下预期的输出应该是什么样子吗?
  • 检查@akrun 输出,类似的东西,谢谢

标签: r tidyverse


【解决方案1】:

tidyr 的开发版本中的一个选项是 pivot_wider(根据 'month'、'level' 的组合,'n' 似乎是 spread

library(dplyr)
library(tidyr) # 0.8.3.9000
df %>% 
  group_by(name, month, level) %>%
  summarise(n = n()) %>% 
  ungroup() %>%
  pivot_wider(names_from = c('month', 'level'), values_from = 'n')
# A tibble: 5 x 11
#  name  `5_3` `3_3` `4_1` `12_2` `1_1` `9_3` `10_1` `10_3` `7_1` `11_1`
#  <fct> <int> <int> <int>  <int> <int> <int>  <int>  <int> <int>  <int>
#1 a         1    NA    NA     NA    NA    NA     NA     NA    NA     NA
#2 b        NA     1     1      1    NA    NA     NA     NA    NA     NA
#3 c        NA    NA    NA     NA     1     1      1      1    NA     NA
#4 d        NA    NA    NA     NA    NA    NA     NA     NA     1     NA
#5 e        NA    NA    NA     NA    NA    NA     NA     NA    NA      1

如果我们想使用spread,那么unite 到单个列并使用spread。它也应该适用于最新的CRAN 版本的tidyr (0.8.3)

df %>% 
  group_by(name, month, level) %>%
  summarise(n = n()) %>% 
  ungroup %>%
  unite(monthlevel, month, level) %>%
  spread(monthlevel, n)

或者使用来自data.tabledcast

library(data.table)
dcast(setDT(df)[, .N, .(name, month, level)], name ~ month + level, value.var = 'N')

【讨论】:

  • 非常感谢预期的输出,但我的 R 没有找到 pivot_wider 函数(我将 tidyr 包更新到 0.8.3 版本)
  • @DimitriPetrenko。我使用了 tidyr 0.8.3.9000 的开发版本。您可以从github 安装它
  • 谢谢,我会检查一下
  • @DimitriPetrenko。你也可以unite(更新答案)然后spread
  • 非常感谢你正是我所需要的,有趣的所有这些可能性
猜你喜欢
  • 1970-01-01
  • 2015-07-04
  • 2023-03-12
  • 2018-03-06
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 2011-12-21
相关资源
最近更新 更多