【问题标题】:How to transform long to wide reshape with tidyverse [duplicate]如何使用 tidyverse 将长形转换为宽形 [重复]
【发布时间】:2019-06-13 09:28:51
【问题描述】:

我想用 tidyverse::spread 将我的长数据帧重塑为宽格式。我应该怎么做才能包含转换的所有变量。

我的意见:

df <- tibble::tribble(
  ~respid, ~member_id, ~gender, ~edu,  ~dob,
     100L,  1L,      1L,   3L, 1978L,
     100L,  2L,      1L,   3L, 1980L,
     200L,  1L,      1L,   4L, 1974L,
     200L,  2L,      2L,   5L, 1955L,
     300L,  1L,      2L,   3L, 1998L,
     300L,  2L,      1L,   4L, 1999L,
     300L,  3L,      2L,   3L, 2001L
  )

希望输出:

output <- tibble::tribble(
  ~respid, ~gender_1, ~edu_1, ~dob_1, ~gender_2, ~edu_2, ~dob_2, ~gender_3, ~edu_3, ~dob_3,
     100L,        1L,     3L,  1978L,        1L,     3L,  1980L,        NA,     NA,     NA,
     200L,        1L,     4L,  1974L,        2L,     5L,  1955L,        NA,     NA,     NA,
     300L,        2L,     3L,  1998L,        1L,     4L,  1999L,        2L,     3L,  2001L
  )

我在这里尝试过,但 row_number() 看起来不正确。

df %>%
  group_by(member_id) %>% 
  mutate(t1 = paste0("gender_" , row_number())) %>%
  spread(t1, gender)

【问题讨论】:

    标签: r tidyverse tidyr


    【解决方案1】:

    你可以这样做:

    df %>%
     gather(var, val, -c(respid, member_id)) %>%
     mutate(var = paste(var, member_id, sep = "_")) %>%
     select(-member_id) %>%
     spread(var, val)
    
      respid dob_1 dob_2 dob_3 edu_1 edu_2 edu_3 gender_1 gender_2 gender_3
       <int> <int> <int> <int> <int> <int> <int>    <int>    <int>    <int>
    1    100  1978  1980    NA     3     3    NA        1        1       NA
    2    200  1974  1955    NA     4     5    NA        1        2       NA
    3    300  1998  1999  2001     3     4     3        2        1        2
    

    首先,它将数据从宽格式转换为长格式。其次,它创建了新的变量名。最后,它返回宽格式。

    或者使用reshape2:

    dcast(melt(df, id.vars = c("respid", "member_id")), respid~variable+member_id, value.var = "value")
    
      respid gender_1 gender_2 gender_3 edu_1 edu_2 edu_3 dob_1 dob_2 dob_3
    1    100        1        1       NA     3     3    NA  1978  1980    NA
    2    200        1        2       NA     4     5    NA  1974  1955    NA
    3    300        2        1        2     3     4     3  1998  1999  2001
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-04
      • 2019-11-11
      • 1970-01-01
      • 2021-05-03
      • 1970-01-01
      相关资源
      最近更新 更多