如何使用tidyverse将长形形状转换为宽形形状

如何使用tidyverse将长形形状转换为宽形形状,r,tidyverse,tidyr,R,Tidyverse,Tidyr,我想用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,

我想用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
  )
你可以做:

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
你可以做:

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
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
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