根据2个条件将一列拆分为多列

时间:2018-11-03 19:50:27

标签: r split

我的数据框很大,我想根据插入号^和IMM-之后的字母这两个条件将一列分为许多列。根据下面的数据,第1列将分为名为IMM-A,IMM-B,IMM-C和IMM-W的列。我尝试了单独的功能,但是只有在您指定列名的情况下它才起作用,并且由于我的数据不一致,所以我并不总是知道列名应该是什么。

SampleId  Column1
1         IMM-A*010306+IMM-A*0209^IMM-B*6900+IMM-B*779999^IMM-C*1212+IMM-C*3333
2         IMM-A*010306+IMM-A*0209^IMM-C*6900+IMM-C*779999^IMM-W*1212+IMM-W*3333
3         IMM-B*010306+IMM-B*0209^IMM-C*6900+IMM-C*779999^IMM-W*1212+IMM-W*3333

预期输出为;

SampleId    IMM-A                   IMM-B                   IMM-C                IMM-W
1           IMM-A*010306+IMM-A*0209 IMM-B*6900+IMM-B*779999 IMM-C*1212+IMM-C*3333
2           IMM-A*010306+IMM-A*0209                         IMM-C*6900+IMM-C*779999 IMM-W*1212+IMM-W*3333
3                                   IMM-B*010306+IMM-B*0209 IMM-C*6900+IMM-C*779999 IMM-W*1212+IMM-W*3333                                                                           

1 个答案:

答案 0 :(得分:3)

不清楚预期的输出。根据说明,我们可能需要

library(tidyverse)
map(strsplit(df$Column1, "[*+^]"), ~  
  stack(setNames(as.list(.x[c(FALSE, TRUE)]), .x[c(TRUE, FALSE)])) %>% 
  group_by(ind) %>% 
  mutate(rn = row_number()) %>% 
  spread(ind, values)) %>% 
  set_names(df$SampleId) %>%
  bind_rows(.id = 'SampleId') %>%
  select(-rn)
# A tibble: 6 x 5
#  SampleId `IMM-A` `IMM-B` `IMM-C` `IMM-W`
#  <chr>    <chr>   <chr>   <chr>   <chr>  
#1 1        010306  6900    1212    <NA>   
#2 1        0209    779999  3333    <NA>   
#3 2        010306  <NA>    6900    1212   
#4 2        0209    <NA>    779999  3333   
#5 3        <NA>    010306  6900    1212   
#6 3        <NA>    0209    779999  3333   

更新

基于OP的预期输出,我们通过在^分隔符处拆分'Column1',然后在分隔符处将{Column1'separate拆分为'colA','colB'来扩展数据*,将“ colB”和spread删除为“宽”格式

df %>% 
   separate_rows(Column1, sep = "\\^") %>% 
   separate(Column1, into = c("colA", "colB"), remove = FALSE, sep="[*]") %>% 
   select(-colB) %>% 
   spread(colA, Column1, fill = "")
#SampleId                   IMM-A                   IMM-B                   IMM-C                 IMM-W
#1        1 IMM-A*010306+IMM-A*0209 IMM-B*6900+IMM-B*779999   IMM-C*1212+IMM-C*3333                      
#2        2 IMM-A*010306+IMM-A*0209                         IMM-C*6900+IMM-C*779999 IMM-W*1212+IMM-W*3333
#3        3                         IMM-B*010306+IMM-B*0209 IMM-C*6900+IMM-C*779999 IMM-W*1212+IMM-W*3333

数据

df <- structure(list(SampleId = 1:3, Column1 = 
  c("IMM-A*010306+IMM-A*0209^IMM-B*6900+IMM-B*779999^IMM-C*1212+IMM-C*3333", 
 "IMM-A*010306+IMM-A*0209^IMM-C*6900+IMM-C*779999^IMM-W*1212+IMM-W*3333", 
 "IMM-B*010306+IMM-B*0209^IMM-C*6900+IMM-C*779999^IMM-W*1212+IMM-W*3333"
 )), class = "data.frame", row.names = c(NA, -3L))