使用 Tidyr 透视更长的时间 - 多个变量存储在列名中

Pivot longer using Tidyr - Multiple variables stored in column names

我正在尝试重塑以下输入:

  family_number father_name father_code mother_name mother_code children
1             1        John         M11        Jane         F21        2
2             2      Thomas         M12        Mary         F22        3
3             3        Jack         M13    Jennifer         F23        0

使用 tidyr::pivot_longer:

转换成更长的格式
  family_number     name code children
1             1     John  M11        2
2             1     Jane  F21        2
3             2   Thomas  M12        3
4             2     Mary  F22        3
5             3     Jack  M13        0
6             3 Jennifer  F23        0

如果您有多个特别想要旋转的列,我不太明白它是如何工作的。谢谢!

输入table代码:

foo <- data.frame(family_number = c(1, 2, 3),
                  father_name = c("John", "Thomas", "Jack"),
                  father_code = c("M11", "M12", "M13"),
                  mother_name = c("Jane", "Mary", "Jennifer"),
                  mother_code = c("F21", "F22", "F23"),
                  children = c(2, 3, 0))

我不认为您可以在单个数据透视操作中完成它。您只能在一列中旋转几列,afaik。我的方法是合并列、旋转然后将它们分开。

foo %>%
  tidyr::unite("father", father_name, father_code) %>% 
  tidyr::unite("mother", mother_name, mother_code) %>% 
  tidyr::pivot_longer(c(father, mother), values_to = "parent") %>% 
  select(-name) %>% 
  tidyr::separate(parent, into=c("name", "code"))

# A tibble: 6 x 4
  family_number children name     code 
          <dbl>    <dbl> <chr>    <chr>
1             1        2 John     M11  
2             1        2 Jane     F21  
3             2        3 Thomas   M12  
4             2        3 Mary     F22  
5             3        0 Jack     M13  
6             3        0 Jennifer F23  

我们可以使用 pivot_longer 通过指定 names_to 来匹配列名称中的模式

library(dplyr)
library(tidyr)

foo %>% 
   pivot_longer(cols = -c(family_number, children), 
        names_to = c("grp", ".value"), names_sep = "_") %>%
        select(-grp)
# A tibble: 6 x 4
#  family_number children name     code 
#          <dbl>    <dbl> <chr>    <chr>
#1             1        2 John     M11  
#2             1        2 Jane     F21  
#3             2        3 Thomas   M12  
#4             2        3 Mary     F22  
#5             3        0 Jack     M13  
#6             3        0 Jennifer F23