首页 > 解决方案 > R - 将 i 个逗号分隔 ID 的字符向量分解为数据帧的 i 个离散向量

问题描述

数据帧df包括两个字符向量。以下是前 10 行:

rowid  codes_raw                            
a      15-1132, 15-1133                     
b      21-1091, 21-1094, 21-1099            
c      25-9011, 25-9021, 25-9031, 25-9099   
d      31-9093, 31-9099                     
e      33-9092, 33-9099                     
f      37-2011, 37-2019                     
g      39-4011, 39-4021                     
h      47-5051, 47-5099                     
i      49-2094, 49-2095                     
j      49-9041                    

df$codes_raw包含给定行的 1 到 i 个离散标识符。这些标识符需要分布在同一数据帧中的 i 个新向量中。结果应如下所示:

rowid codes_raw                            code_1     code_2     code_3     code_4
a     15-1132, 15-1133                     15-1132    15-1133
b     21-1091, 21-1094, 21-1099            21-1091    21-1094    21-1099
c     25-9011, 25-9021, 25-9031, 25-9099   25-9011    25-9021    25-9031    25-9099
d     31-9093, 31-9099                     31-9093    31-9099
e     33-9092, 33-9099                     33-9092    33-9099
f     37-2011, 37-2019                     37-2011    37-2019
g     39-4011, 39-4021                     39-4011    39-4021
h     47-5051, 47-5099                     47-5051    47-5099
i     49-2094, 49-2095                     49-2094    49-2095
j     49-9041                              49-9041

if_else()我当前的解决方案涉及对每个字符串的单独调用,这很笨重。例如:

df$code_2 <- if_else(
  grepl(',', df$codes_raw),
  sub('.*,\\s*', '', df$codes_raw),
  ' ')

我还希望该解决方案在df$codes_raw. 我正在寻找更优雅和更有活力的替代品。

标签: rregexstringvectordata-cleaning

解决方案


使用“分离()”

library(tidyr)

lengths <- max(sapply(strsplit(df$codes_raw, split= ", "), length)) 
names  <- sapply(seq(lengths), function(x) paste0("code_", x))

df %>%
  separate(codes_raw,
           into = names, sep = ", " , remove = FALSE)

   rowid                       codes_raw  code_1  code_2  code_3  code_4
1      a                 15-1132,15-1133 15-1132 15-1133    <NA>    <NA>
2      b         21-1091,21-1094,21-1099 21-1091 21-1094 21-1099    <NA>
3      c 25-9011,25-9021,25-9031,25-9099 25-9011 25-9021 25-9031 25-9099
4      d                 31-9093,31-9099 31-9093 31-9099    <NA>    <NA>
5      e                 33-9092,33-9099 33-9092 33-9099    <NA>    <NA>
6      f                 37-2011,37-2019 37-2011 37-2019    <NA>    <NA>
7      g                 39-4011,39-4021 39-4011 39-4021    <NA>    <NA>
8      h                 47-5051,47-5099 47-5051 47-5099    <NA>    <NA>
9      i                 49-2094,49-2095 49-2094 49-2095    <NA>    <NA>
10     j                         49-9041 49-9041    <NA>    <NA>    <NA>   

推荐阅读