【问题标题】:Splitting a column into multiple columns based on 2 conditions根据 2 个条件将一列拆分为多列
【发布时间】:2018-11-03 19:50:26
【问题描述】:

我有一个大数据框,我想根据插入符号 ^ 和 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                                                                           

【问题讨论】:

  • 请查看我的编辑
  • 感谢您更新帖子。我更新了解决方案

标签: r split


【解决方案1】:

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

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' 拆分,然后将 separate 'Column1' 拆分为 'colA'、'colB' 分隔符 * 来扩展数据,将 'colB' 和 spread 删除为 'wide' 格式

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))

【讨论】:

    猜你喜欢
    • 2023-01-10
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-22
    • 2019-10-12
    • 1970-01-01
    相关资源
    最近更新 更多