【问题标题】:tidyr: Separate a column into a variable number of columnstidyr:将一列分成可变数量的列
【发布时间】:2021-01-06 05:12:55
【问题描述】:

我的数据框中有一个变量,其中包含回答问卷中不同问题的长度。数据结构如下:

data <- data.frame(variables = c("q1:2,q2:3,q3:4,q4:10,q5:1",
                                 "q2:3,q1:2,q3:2,q5:2,q4:9",
                                 "q1:1,q2:4,q5:8"))
        separate(variables, sep=",", into=??)

q1:2 表示该受访者需要 2 秒才能回答问题 1 (q1)。

现在,我想使用分隔符“,”separate()此列。但我不知道“into”参数应该是什么,因为并非所有受访者都回答了相同数量的问题。

我们的目标是有一个这样的数据框(不是关于持续时间,而是关于每个问卷中问题的位置):

pos_q1 pos_q2 pos_q3 pos_q4 pos_q5
----------------------------------
     1      2      3      4      5
     2      1      3      5      4
     1      2     NA     NA      3          

有人可以帮忙吗?谢谢!

【问题讨论】:

  • 我不清楚你输出中的最后一行为什么是 1, 2, NA, NA, 3 ?
  • 因为先回答了问题1,然后回答了问题2,最后回答了问题5(q3和q4根本没有回答)。

标签: r tidyr


【解决方案1】:

您可以先使用separate_rows获取长格式数据,然后将separate分到不同的列中,为每一行创建一个行号列并获取宽格式数据。

library(dplyr)
library(tidyr)

data %>%
  mutate(id = row_number()) %>%
  separate_rows(variables, sep = ',') %>%
  separate(variables, c('question', 'time'), sep = ':') %>%
  group_by(id) %>%
  mutate(time = row_number()) %>%
  ungroup %>%
  pivot_wider(names_from = question,values_from=time, names_prefix = 'pos_') %>%
  select(-id)

# A tibble: 3 x 5
#  pos_q1 pos_q2 pos_q3 pos_q4 pos_q5
#   <int>  <int>  <int>  <int>  <int>
#1      1      2      3      4      5
#2      2      1      3      5      4
#3      1      2     NA     NA      3

【讨论】:

    猜你喜欢
    • 2018-09-13
    • 2015-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多