字符串将R中的所有列拆分在一起

时间:2018-12-17 10:56:33

标签: r

我的文本文件如下:

22  16050115    0|0:404
22  16050213    0|0:403 1|0:1
22  16050607    0|0:400 0|1:2   1|0:2
22  16050739    0|0:403 1|0:1
22  16050783    0|0:404
22  16050840    0|0:391 0|1:9   1|0:4
22  16050847    0|0:402 1|0:2
22  16050922    0|0:404
22  16050984    0|0:404
22  16051075    0|0:404
22  16051249    0|0:333 0|1:31  1|0:37  1|1:3
22  16051722    0|0:404
22  16051874    0|0:404
22  16051927    0|0:404
22  16052080    0|0:316 0|1:37  1|0:51
22  16052097    0|0:404
22  16052167    0|0:177 0|1:80  1|0:85  1|1:62
22  16052240    0|0:404

我想将所有列一起字符串拆分。我可以使用

一栏
x <- strsplit(as.character(data), ":")
x<-unlist(x)

但是无法对所有列进行操作。

预期输出:

A   B       C   D   E       F   G   H   I    J
22  16050115    0|0     404
22  16050213    0|0     403 1|0    1
22  16050607    0|0     400 0|1     2   1|0     2
22  16050739    0|0     403 1|0     1
22  16050783    0|0     404
22  16050840    0|0     391 0|1     9   1|0     4
22  16050847    0|0     402 1|0     2
22  16050922    0|0     404
22  16050984    0|0     404
22  16051075    0|0     04
22  16051249    0|0  333    0|1     31  1|0     37  1|1     3
22  16051722    0|0     404
22  16051874    0|0     404
22  16051927    0|0     404
22  16052080    0|0     316 0|1     37  1|0     51
22  16052097    0|0     404
22  16052167    0|0     177 0|1     80  1|0     85  1|1     62
22  16052240    0|0     404

感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

我们可以使用purrr::map

library(purrr) 
map(df$A, function(x) { unlist(strsplit(x,split=':|\\s+'))}) %>% 
       map_df( ~ data_frame(A = .x[1],B=.x[2],C=.x[3],D=.x[4],E=.x[5],F=.x[6],G=.x[7],H=.x[8],I=.x[9],K=.x[10]))

# A tibble: 4 x 10
     A     B        C     D     E     F     G     H     I     K    
   <chr> <chr>    <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
  1 22    16050115 0|0   404   NA    NA    NA    NA    NA    NA   
  2 22    16050213 0|0   403   1|0   1     NA    NA    NA    NA   
  3 22    16050840 0|0   391   0|1   9     1|0   4     NA    NA   
  4 22    16052167 0|0   177   0|1   80    1|0   85    1|1   62  

数据

structure(list(A = c("22  16050115    0|0:404", "22  16050213    0|0:403 1|0:1", 
   "22  16050840    0|0:391 0|1:9   1|0:4", "22  16052167    0|0:177 0|1:80  1|0:85  1|1:62"
    )), .Names = "A", row.names = c(NA, -4L), class = "data.frame")

答案 1 :(得分:0)

假设这是您的数据

example = data.frame(ID = c(1,2,3),FO = c("Jim","Jim","Jim"),A = c("Y:401","Z:506","L:405"),
                     B = c("T:402","X:501","A:"),
                     C = c("Y:112","L:506",":908"),stringsAsFactors = F)

> example
  ID  FO     A     B     C
1  1 Jim Y:401 T:402 Y:112
2  2 Jim Z:506 X:501 L:506
3  3 Jim L:405    A:  :908

下面显示了一次将一个数据帧中的多列拆分的简单方法

library(dplyr)
library(tidyverse)

example %>% 
  gather(key, value, -ID,-FO) %>% 
  separate_rows(value, sep = ":") %>% 
  group_by(key, ID) %>% 
  mutate(key2 = paste0(key, "_", seq_along(key))) %>%
  ungroup() %>% 
  select(-key) %>% 
  spread(key2, value)

# A tibble: 3 x 8
     ID FO    A_1   A_2   B_1   B_2   C_1   C_2  
  <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1     1 Jim   Y     401   T     402   Y     112  
2     2 Jim   Z     506   X     501   L     506  
3     3 Jim   L     405   A     ""    ""    908 

希望这会有所帮助,请在查询之前添加示例数据。谢谢