如何使用tidyverse将长形形状转换为宽形形状
我想用tidyverse::spread将我的长数据帧重塑为宽格式。我应该做些什么来包含所有用于转换的变量 我的意见:如何使用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,
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