2015-09-11 1 views
1

У меня есть пробелы for for, который разбивает столбцы символов размеров (длина x ширина x глубина), а затем присваивает эти значения новому столбцу. Прямо сейчас я перебираю каждое наблюдение в своем ядре данных для создания этих переменных. Вот мой код (который работает), но медленный.Plyr/Apply in Place of A For Loop Вместо этого

library(stringi) 

for(i in 1:nrow(data3)){ 
    data3$Length[i] <- stri_split_fixed(str = as.character(data3$Dimensions[i]),pattern = "x", omit_empty = NA)[[1]][1] 
    data3$Width[i] <- stri_split_fixed(str = as.character(data3$Dimensions[i]),pattern = "x", omit_empty = NA)[[1]][2] 
    data3$Depth[i] <- stri_split_fixed(str = as.character(data3$Dimensions[i]),pattern = "x", omit_empty = NA)[[1]][3] 
} 

Есть ли функция plyr или apply, которая ускорит эту операцию? Если да, то какой синтаксис?

Обновление: Образец данных:

structure(list(Shape = structure(c(24L, 24L, 24L, 24L, 24L, 24L, 
24L, 24L, 24L, 24L), .Label = c("Asscher", "Baguette", "Briolette", 
"Bullets", "Circular Brilliant", "Cushion", "Emerald", "Flanders", 
"Half Moon", "Heart", "Hexagon", "Kite", "Lozenge", "Marquise", 
"Octagonal", "Old European", "Old Miner", "Other", "Oval", "Pear", 
"Princess", "Radiant", "Rose Cut", "Round", "Shield", "Square", 
"Tapered Baguette", "Trapezoid", "Triangular"), class = "factor"), 
    Carats = c(0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4 
    ), Color = structure(c(6L, 7L, 2L, 4L, 6L, 1L, 1L, 7L, 8L, 
    2L), .Label = c("D", "E", "F", "G", "H", "I", "J", "K", "L", 
    "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", 
    "Y", "Z"), class = "factor"), Dimensions = c("4.58x4.61x2.97", 
    "4.66x4.69x2.95", "4.71x4.75x2.93", "4.73x4.74x2.91", "4.62x4.67x2.93", 
    "4.79x4.82x2.91", "4.6x4.62x2.92", "4.7x4.73x2.93", "4.66x4.7x2.91", 
    "4.68x4.71x2.92")), .Names = c("Shape", "Carats", "Color", 
"Dimensions"), row.names = 400:409, class = "data.frame") 

ответ

2

Нет необходимости в цикле. Функция векторизована, то есть она действует на весь столбец одновременно. Фактически, вы можете получить все три столбца за один раз:

data3[,c("Length","Width","Depth")] = 
      do.call(rbind, stri_split_fixed(str = as.character(data3$Dimensions), 
              pattern = "x", omit_empty = NA)) 

    Shape Carats Color  Dimensions Length Width Depth 
400 Round 0.4  I 4.58x4.61x2.97 4.58 4.61 2.97 
401 Round 0.4  J 4.66x4.69x2.95 4.66 4.69 2.95 
402 Round 0.4  E 4.71x4.75x2.93 4.71 4.75 2.93 
403 Round 0.4  G 4.73x4.74x2.91 4.73 4.74 2.91 
404 Round 0.4  I 4.62x4.67x2.93 4.62 4.67 2.93 
405 Round 0.4  D 4.79x4.82x2.91 4.79 4.82 2.91 
406 Round 0.4  D 4.6x4.62x2.92 4.6 4.62 2.92 
407 Round 0.4  J 4.7x4.73x2.93 4.7 4.73 2.93 
408 Round 0.4  K 4.66x4.7x2.91 4.66 4.7 2.91 
409 Round 0.4  E 4.68x4.71x2.92 4.68 4.71 2.92 
+0

Хороший звонок. Это работает и намного быстрее, чем цикл. –

+0

На самом деле это не так. Я просто попытался запустить операцию и получил ошибку. Большинство измерений выглядят как 4.74x4.77x2.85. После запуска первого кода все наблюдения имеют следующее: 4.74, 4.77, 2.85, хотя это только размеры для первого. Функция stri_split_fixed возвращает список. –

+0

Отправьте образец своих данных (вставьте в свой вопрос вывод 'dput (data3 [1:10,])'), и я исправлю его. – eipi10