我有一个如下所示的数据框:
df <- data.frame(residence_pre = c("house", "apartment", "house"),
residence_during = c("house", "apartment", "house"),
residence_after = c("house", "apartment", "house"),
family_pre = c(1,2,3),
family_during = c(2,2,4),
family_after = c(1,2,4))
我想以如下方式旋转它: (这是示例数据。真实数据框中还有更多列,都遵循这种模式)
pivot <- data.frame(obs.number = c(1, 1, 1, 2, 2, 2, 3, 3, 3),
residence = c("house", "house", "house", "apartment", "apartment", "apartment", "house", "house", "house"),
family = c(1, 2, 1, 2, 2, 2, 3, 4, 4),
status = c("pre", "during", "after", "pre", "during", "after", "pre", "during", "after"))
这是您可以尝试的方法
df2 <- df %>% mutate(obs.number=row_number()) %>%
pivot_longer(cols = c(residence_pre,residence_during,residence_after),
names_to = 'status', values_to = 'residence',
names_prefix='residence_') %>% select(status,residence,obs.number)
df3<- df %>% mutate(obs.number=row_number()) %>%
pivot_longer(cols = c(family_pre,family_during,family_after),
names_to = 'status', values_to = 'family',
names_prefix='family_') %>% select(status,family,obs.number)
df4 <- df2 %>% left_join(df3, by=c('status','obs.number'))
# A tibble: 9 × 4
status residence obs.number family
<chr> <chr> <int> <dbl>
1 pre house 1 1
2 during house 1 2
3 after house 1 1
4 pre apartment 2 2
5 during apartment 2 2
6 after apartment 2 2
7 pre house 3 3
8 during house 3 4
9 after house 3 4