【问题标题】:How to convert multiple columns with various category levels to wide format?如何将具有不同类别级别的多个列转换为宽格式?
【发布时间】:2023-07-30 15:13:01
【问题描述】:

我有以下一组数据,其中包含多个对应的列:prompt1 与 value1,prompt2 与 value2,promptn 与 valuen。每个提示最多包含 3 个不同级别的类别。

df.1 <- data.frame(prompt1         = c('date', 'company', 'invoice'),
               value1              = c('2017-01-01', 'Tellabs', '23845'),
               prompt2             = c('code', 'city', 'item'),
               value2              = c('B34', 'Ilinois', 'SER0000066'),
               stringsAsFactors    = FALSE)

所需的数据框是:

df.2 <- data.frame(date              = '2017-01-010',
                   company           = 'Tellabs',
                   invoice           = '23845',
                   code              = 'B34',
                   city              = 'Ilinois',
                   item              = 'SER0000066',
                   stringsAsFactors  = FALSE)

我尝试过从 tidyr 传播,但没有成功

【问题讨论】:

  • 所有列名格式相同?喜欢提示或值作为前缀?
  • @Wen,问题之一是并非所有级别都具有相同的长度,因此,在执行传播时有很多 NA,但是,ycw 解决方案是完美的。 10 倍。

标签: r dplyr tidyr spread


【解决方案1】:

使用dplyrtidyr 中的函数的解决方案。

library(dplyr)
library(tidyr)

df.2 <- df.1 %>%
  gather(Prompt, Column, contains("prompt")) %>%
  gather(Value, Content, contains("value")) %>%
  filter(sub("prompt", "", Prompt) == sub("value", "", Value)) %>%
  select(Column, Content) %>%
  spread(Column, Content) %>%
  select(date, company, invoice, code, city, item)

【讨论】:

  • 非常感谢。我只是想了解更多关于这样做的知识
  • @William 我很高兴为您提供帮助。如果此解决方案有帮助,请在左上角标记绿色错误以接受它。