r - 在 R 中分割字符串时有效替换 for 循环

标签 r performance

我有一个大型数据框(20 列,>100k 行),需要将一列字符串拆分为多个新列。

相关列的前 3 个观察结果如下:

scans <- data.frame(scan = c("CT Cervical Sp,CT Head Plain", "II < 1 Hour", 
                 "L-S Spine,L-S Spine"))

看起来像这样:

                          scan
1 CT Cervical Sp,CT Head Plain
2                  II < 1 Hour
3          L-S Spine,L-S Spine

我需要将其分成 5 列(每个观察中最多有 5 个子字符串),对于子字符串较少的观察,我希望剩余的列填充 NA。我目前正在使用此代码:

scans <- data.frame(scan = c("CT Cervical Sp,CT Head Plain", "II < 1 Hour",
"L-S Spine,L-S Spine"))

for(i in 1:nrow(scans)){
  scans$scan1[i] <- strsplit(scans$scan, ",")[[i]][1]
  scans$scan2[i] <- strsplit(scans$scan, ",")[[i]][2]
  scans$scan3[i] <- strsplit(scans$scan, ",")[[i]][3]
  scans$scan4[i] <- strsplit(scans$scan, ",")[[i]][4]
  scans$scan5[i] <- strsplit(scans$scan, ",")[[i]][5]
}

它可以工作并输出我想要的解决方案:

                          scan          scan1         scan2 scan3 scan4 scan5
1 CT Cervical Sp,CT Head Plain CT Cervical Sp CT Head Plain    NA    NA    NA
2                  II < 1 Hour    II < 1 Hour            NA    NA    NA    NA
3          L-S Spine,L-S Spine      L-S Spine     L-S Spine    NA    NA    NA

...但是速度真的很慢。循环数万或数十万个观察结果非常耗时。

非常感谢您的建议。

最佳答案

另一种方法是在devel version中使用tstrsplit data.table

library(data.table) # v >= 1.9.5
setDT(scans)[, tstrsplit(scan, ",", fixed = TRUE)]
#                V1            V2
# 1: CT Cervical Sp CT Head Plain
# 2:    II < 1 Hour            NA
# 3:      L-S Spine     L-S Spine 

如果您确定至少有一次 5 次拆分,您可以通过引用轻松创建这些列

setDT(scans)[, paste0("scan", 1:5) := tstrsplit(scan, ",")]
<小时/>

或者,tidyr 包提供类似的功能

library(tidyr)
separate(scans, scan, paste0("scan", 1:2), ",", extra = "merge", remove = FALSE)
#                           scan          scan1         scan2
# 1 CT Cervical Sp,CT Head Plain CT Cervical Sp CT Head Plain
# 2                  II < 1 Hour    II < 1 Hour          <NA>
# 3          L-S Spine,L-S Spine      L-S Spine     L-S Spine
<小时/>

或者仅使用base R的另一个选项

 cbind(scans, read.table(text= as.character(scans$scan),sep=",", fill=TRUE, na.strings=''))

关于r - 在 R 中分割字符串时有效替换 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31404982/

相关文章:

r - 使用 NA 时向量长度不同

r - 添加包含整数列的分箱值的列

mysql - 如何在 MySQL 的某个列上对表进行分区?

.NET 基准测试框架

css - 较大的 css 文件会减慢 Dom 处理速度吗?

javascript - 性能问题: storing a reference to DOM element vs using selectors

r - R中的tryCatch block ,返回变量

r - R中的unicode转换和导出

r - 获取函数内部函数调用的函数组件

performance - 使用 Similarity Postgres 模糊自连接查询提高性能