【问题标题】:how do I gather 2 sets of columns in tidyr [duplicate]如何在 tidyr 中收集 2 组列 [重复]
【发布时间】:2015-08-26 13:37:54
【问题描述】:

我有以下结构:

key | category_x | 2009 | category_y | 2010
test

请求的示例数据

set.seed(24)
df <- data.frame(
key = 1:10,
category_x = paste0("stock_", 0:9),
'2008' = rnorm(10, 0, 10),
category_y = paste0("stock_", 0:9),
'2009' = rnorm(10, 0, 10),
category_z = paste0("stock_", 0:9),
'2010' = rnorm(10, 0, 10),
check.names=FALSE
)

如何将其更改为:

key | category | year

我知道我可以使用:

library(magrittr)
library(dplyr)
library(tidyr)

data %>% gather(key, category, starts_with("category_"))

但这与年份无关。 我看了Gather multiple sets of columns

但我没有得到提取扩展命令。

【问题讨论】:

  • 那么我如何生成随机字符串供您测试?
  • 是的,修复了粘贴命令

标签: r tidyr


【解决方案1】:

如果我们使用gather,我们可以分两步完成。首先,我们将以“category”开头的列名的格式从“wide”转换为“long”格式,在下一步中,我们通过选择matches 对数字列名执行相同的操作。 matches 可以正则表达式模式,所以^[0-9]+$ 的模式意味着我们从字符串的开头 (^) 到结尾 ($) 匹配一个或多个数字 ([0-9]+)。我们可以使用select 删除不需要的列。

library(tidyr)
library(dplyr) 
gather(df, key, category, starts_with('category_')) %>%
     gather(key2, year, matches('^[0-9]+$')) %>%
     select(-starts_with('key'))

或者使用data.table 的开发版本,这会容易得多,因为melt 可以为measure 列采用多种模式。我们将“data.frame”转换为“data.table”(setDT(df)),使用melt 并在measure 参数中指定patterns。我们还可以选择更改“值”列的列名。 'variable' 列设置为 NULL,因为预期输出中不需要它。

library(data.table)#v1.9.5+
melt(setDT(df), measure=patterns(c('^category', '^[0-9]+$')), 
           value.name=c('category', 'year'))[, variable:=NULL][]

【讨论】:

  • 整洁的版本产生不正确的结果
猜你喜欢
  • 2016-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-15
  • 2017-06-12
  • 2016-11-23
  • 1970-01-01
  • 2018-07-28
相关资源
最近更新 更多