将可变的列数从长转换为宽

时间:2019-02-20 16:25:05

标签: r tidyr

给出以下长格式的数据,我想创建一个宽数据集,其中每个 srdr_id 一行,并为每个 arm_name 单独创建一个列,如下所示。

所需的输出

srdr_id c1  c2 c3
174212  TAU MI MI
172612  TAU MI 

我尝试tidyr :: spread()失败。

   dat <- structure(list(srdr_id = c("174212", "174212", "174212", "172612", 
    "172612"), arm_name = c("TAU", "MI", "MI", "TAU", "MI")), class = c("tbl_df", 
    "tbl", "data.frame"), row.names = c(NA, -5L))

根据第一个建议,我尝试了:

dat %>%  group_by(srdr_id) %>% mutate(rn = row_number()) %>% spread(srdr_id, arm_name)

结果:

m  172612 174212
1  TAU    TAU
2  MI     MI
3  NA     MI

我想要换位的版本。

1 个答案:

答案 0 :(得分:1)

我们可以通过spread idarm_name来更改@akrun的建议,因为id是“关键字”,arm_name是“值”:

library(dplyr)
library(tidyr)

dat %>% 
  group_by(srdr_id) %>% 
  mutate(id = paste0("c", row_number())) %>% 
  spread(id, arm_name)

输出:

# A tibble: 2 x 4
# Groups:   srdr_id [2]
  srdr_id c1    c2    c3   
  <chr>   <chr> <chr> <chr>
1 172612  TAU   MI    <NA> 
2 174212  TAU   MI    MI