【发布时间】:2014-02-12 16:11:53
【问题描述】:
我有一个 67MM 行的 data.table,其中人名和姓氏用空格分隔。我只需要为每个单词创建一个新列。
这是数据的一小部分:
n <- structure(list(Subscription_Id = c("13.855.231.846.091.000",
"11.156.048.529.090.800", "24.940.584.090.830", "242.753.039.111.124",
"27.843.782.090.830", "13.773.513.145.090.800", "25.691.374.090.830",
"12.236.174.155.090.900", "252.027.904.121.210", "11.136.991.054.110.100"
), Account_Desc = c("AGUAYO CARLA", "LEIVA LILIANA", "FULLANA MARIA LAURA",
"PETREL SERGIO", "IPTICKET SRL", "LEDESMA ORLANDO", "CATTANEO LUIS RAUL",
"CABRAL CARMEN ESTELA", "ITURGOYEN HECTOR", "CASA CASILDO"),
V1 = c("AGUAYO", "LEIVA", "FULLANA", "PETREL", "IPTICKET",
"LEDESMA", "CATTANEO", "CABRAL", "ITURGOYEN", "CASA"), V2 = c("CARLA",
"LILIANA", "MARIA", "SERGIO", "SRL", "ORLANDO", "LUIS", "CARMEN",
"HECTOR", "CASILDO"), V3 = c(NA, NA, "LAURA", NA, NA, NA,
"RAUL", "ESTELA", NA, NA), `NA` = c(NA_character_, NA_character_,
NA_character_, NA_character_, NA_character_, NA_character_,
NA_character_, NA_character_, NA_character_, NA_character_
)), .Names = c("Subscription_Id", "Account_Desc", "V1", "V2",
"V3", NA), class = c("data.table", "data.frame"), row.names = c(NA,
-10L), .internal.selfref = <pointer: 0x0000000000200788>)
require("data.table")
n <- data.table(n)
预期输出
# Subscription_Id Account_Desc V1 V2 V3 NA
# 1: 13.855.231.846.091.000 AGUAYO CARLA AGUAYO CARLA NA NA
# 2: 11.156.048.529.090.800 LEIVA LILIANA LEIVA LILIANA NA NA
# 3: 24.940.584.090.830 FULLANA MARIA LAURA FULLANA MARIA LAURA NA
第一次尝试
如何完成这项工作将是第一个问题
library(stringr)
# This separates the strings, but i loose the Subscription_Id variable.
n[, str_split_fixed(Account_Desc, "[ +]", 4)]
# This doesn't work.
n[, paste0("V",1:4) := str_split_fixed(Account_Desc, "[ +]", 4)]
第二次尝试
这行得通,但我似乎要计算 3 次。不确定它是否 最有效的方法
cols = paste0("V",1:3)
for(j in 1:3){
set(n,i=NULL,j=cols[j],value = sapply(strsplit(as.character(n$Account_Desc),"[ +]"), "[", j))
}
让我们使用 big_n 进行基准测试
big_n <- data.table(Subscription_Id = rep(n[,Subscription_Id],1e7),
Account_Desc = rep(n[,Account_Desc],1e7)
)
【问题讨论】:
-
等到
sep2在fread中实现? ;) -
read.csv可能需要数年时间 -
有 2 个 FR(已经在那里)可以真正帮助您 - 一个是让
rbindlist处理向量列表,另一个是fill参数;在这些实施之前,我认为您的第二个解决方案(可能进行一些小的调整)是可行的方法 -
...不知何故,没有人指出您的时机不对。您只拆分 10 行,而不是 1e7 :-)
-
遵循@Arun 关于将
strsplit移出循环的建议会产生很大的不同,使用strsplit(input, " ", fixed = TRUE)也是如此。结合这两个建议将我在 1e5 行上的时间从 ~ 25 秒减少到 ~ 9 秒。
标签: r data.table strsplit stringr