首页 > 解决方案 > R中的复杂(ish)pivot_longer

问题描述

我有一个大致如下所示的数据集:

person_id mem_was_there_1 mem_was_there_2 mem_was_there_3 new_number_yn_1 new_number_yn_2 new_number_yn_3
      <dbl>           <dbl>           <dbl>           <dbl> <lgl>           <lgl>           <lgl>          
1       100               1               2               3 FALSE           TRUE            FALSE          
2       101               4               5               6 TRUE            FALSE           FALSE          

我需要将这些数据转换为如下内容:

# A tibble: 6 x 4
  person_id    nr mem_was_there new_number_yn
      <dbl> <dbl>         <dbl> <lgl>        
1       100     1             1 FALSE        
2       100     2             2 TRUE         
3       100     3             3 FALSE        
4       101     1             4 TRUE         
5       101     2             5 FALSE        
6       101     3             6 FALSE 

我想使用pivot_longer()fromdplyr选项。我尝试使用此代码,但我没有使用在 ??? 处填写什么 正则表达式到第三个_。理想情况下,我希望names_sep'mem_was_there_xx' 和 'new_number_yn_xx' 分开

df1 %>%
  pivot_longer(cols = c(matches("^mem_was_there"), matches("^new_number_yn")), 
               names_to = c('.value', 'nr'), 
               names_sep = ??? )

df1 <-
 tribble(~person_id, ~mem_was_there_1, ~mem_was_there_2, ~mem_was_there_3, ~new_number_yn_1,  ~new_number_yn_2, ~new_number_yn_3,
         100, 1, 2, 3, F, T, F,
         101, 4, 5, 6, T, F, F)

标签: rdplyrtidyverse

解决方案


这应该可以解决问题:

spec <- data.frame(.name  = names(df1)[-1],
                   nr     = rep(1:3, 2),
                   .value = c(rep("mem_was_there", 3), rep("new_number_yn", 3)),
                   stringsAsFactors = FALSE)

library(tidyverse)    
df1 %>%
  pivot_longer_spec(., spec)

给出:

# # A tibble: 6 x 4
#   person_id    nr mem_was_there new_number_yn
#       <dbl> <int>         <dbl> <lgl>        
# 1       100     1             1 FALSE        
# 2       100     2             2 TRUE         
# 3       100     3             3 FALSE        
# 4       101     1             4 TRUE         
# 5       101     2             5 FALSE        
# 6       101     3             6 FALSE 

推荐阅读