R中的行到列转换

时间:2020-07-24 07:04:39

标签: r

我有数据

S.N  Name1 Name2 Name3 Age1 Age2 Age3 Sex1 Sex2, sex3
1     Tom   Huc   Han   22   60   45   M    F     M 
2     Ham   Hut   Sut   33   41   27   F    M     M 

我需要数据

S.N Name Age Sex
1   Tom  22  M 
2   Huc  60  F

2 个答案:

答案 0 :(得分:0)

使用从tidyr进行透视:

library(tidyverse)

dat <- tribble(~S.N, ~ Name1, ~Name2, ~Name3, ~Age1, ~Age2, ~Age3, ~Sex1, ~Sex2, ~Sex3,
        1  ,   "Tom"  , "Huc" ,  "Han"  , 22  , 60  , 45,   "M" ,  "F" ,    "M" ,
        2  ,   "Ham"  , "Hut" ,  "Sut"  , 33  , 41  , 27,   "F" ,   "M" ,    "M" )

dat %>% 
  pivot_longer(-S.N, names_to = c(".value", "Person"), names_pattern = "(.*)(\\d)") %>% 
  select(-Person)

# A tibble: 6 x 4
    S.N Name    Age Sex  
  <dbl> <chr> <dbl> <chr>
     1 Tom      22 M    
     1 Huc      60 F    
     1 Han      45 M    
     2 Ham      33 F    
     2 Hut      41 M    
     2 Sut      27 M 

答案 1 :(得分:0)

我不确定您是否想要以下内容

lapply(split.default(df1[-1],gsub(".*(\\d+)","\\1",names(df1[-1]))),function(x) cbind(df1[1],x))

给出

$`1`
  S.N Name1 Age1 Sex1
1   1   Tom   22    M
2   2   Ham   33    F

$`2`
  S.N Name2 Age2 Sex2
1   1   Huc   60    F
2   2   Hut   41    M

$`3`
  S.N Name3 Age3 sex3
1   1   Han   45    M
2   2   Sut   27    M