У меня есть строка data.table размером 67 мм с именами и фамилиями людей, разделенными пробелами. Мне просто нужно создать новый столбец для каждого слова.
Вот небольшое подмножество данных:
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
1-я попытка
Как заставить это работать будет первым вопросом
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)]
2-я попытка
Это работает, но я, кажется, делаю расчет 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
? ;) - person Roland   schedule 12.02.2014fread
не получит аргумент типаfill
(как присутствует вread.table
) в ближайшее время, а это означает, что ему будет тяжело с такими несбалансированными строками. - person A5C1D2H2I1M1N2O1R2T1   schedule 12.02.2014read.csv
может занять годы - person Baumann   schedule 12.02.2014rbindlist
работа со списками векторов, а у другого естьfill
аргумент для этого; пока они не будут реализованы, я думаю, что ваше второе решение (возможно, с некоторыми незначительными корректировками) - это путь. - person eddi   schedule 12.02.2014set_method
. У вас жестко запрограммированоn$Account_Desc
в строкеstrsplit
. - person A5C1D2H2I1M1N2O1R2T1   schedule 12.02.2014strsplit
из цикла имеет большое значение, как и использованиеstrsplit(input, " ", fixed = TRUE)
. Включение обоих этих предложений сократило время, которое я получал на 1e5 строк, с ~ 25 секунд до ~ 9 секунд. - person A5C1D2H2I1M1N2O1R2T1   schedule 12.02.2014