【发布时间】:2019-04-09 23:32:01
【问题描述】:
我正在尝试使用 tidyr 将宽格式转换为长格式以收集具有不同类型的多个列。与here 提出的问题基本相同。我是 R 新手,不熟悉语法,所以可能会犯一些明显的错误。
我的数据如下所示:
ID X_1_abc X_1_xyz X_2_abc X_2_xyz X_3_abc X_3_xyz
1 1 1 2 2 2 1
2 1 2 1 0 1 NA
3 1 2 1 1 NA 0
我试过以下代码:
df %<>% gather(var, val, X_1_abc:X_3_xyz) %>%
separate(var, c('var', 'X_number'), sep = 'X_*_', convert = TRUE) %>%
spread(var, val, convert = TRUE)
但这只给了我两列:一列列出变量,另一列列出值。
ID X_num `<NA>`
1 1_abc 1
1 1_xyz 1
1 2_abc 2
1 2_xyz 2
1 3_abc 2
1 3_xyz 1
我正在寻找以下内容:
ID X_num abc xyz
1 1 1 1
1 2 2 2
1 3 2 1
【问题讨论】:
-
获取你的输出,然后
mutate(ID = parse_number(X_num), col = str_sub(X_num, end = -3)) %>% spread(col,`) -
我认为这行不通,因为对于完整的数据集,并非所有变量都有 3 个字母后缀。现在,如果我尝试,我会收到以下错误:
Error:var` 必须计算为单个数字或列名,而不是函数`。 -
好点。正则表达式可能有更好的方法,但 Mauritz 对
tidyr::separate的回答更简洁。