неожиданное поведение применимы в. цикл for в r

applyfor
for
as.characterapply

Я хочу использовать вместо петли, чтобы ускорить функцию, которая создает строку символов вектор из пасты-рушится в каждой строке фрейма данных, которая содержит строк и чисел с множеством знаков после запятой. Скорость отличается, но прилагать силы цифры для заполнения левой стороны с места так, что все значения имеют одинаковое количество символов и раундов цифры для целых чисел, а цикла нет.Я смог обойти это делают с цифрами, но использование фрейма данных памяти гораздо больше, и я до сих пор не знаю, почему это. У кого-нибудь есть объяснение или лучшее решение?

apply

Использование :

df <- data.frame(V1=rep(letters[1:20], 1000/20), V2=(1:1000)+0.00000001, + V3=rep(letters[1:20], 1000/20), stringsAsFactors=F)system.time(varapl <- apply(df, 1, function(x){                paste(x[1:3], collapse="_")                }))varapl[c(1,10,100,1000)]

Выход:

  user  system elapsed   0.01    0.00    0.02 [1] "a_   1_a" "j_  10_j" "t_ 100_t" "t_1000_t"# Spaces to the right and rounded!
for

Использование :

varfor <- NULLsystem.time(for(i in 1:1000){  varfor <- c(varfor, paste(df[i,1:3], collapse="_"))})varfor[c(1,10,100,1000)]

Выход:

   user  system elapsed    0.19    0.00    0.19 [1] "a_1.00000001_a"    "j_10.00000001_j"   "t_100.00000001_t"  "t_1000.00000001_t"# This is what I'm looking for!

Решение было:

df2 <- data.frame(V1=rep(letters[1:20], 1000/20), + V2=as.character((1:1000)+0.00000001),+ V3=rep(letters[1:20], 1000/20), stringsAsFactors=F)varapl[c(1,10,100,1000)][1] "a_1.00000001_a"   "j_10.00000001_j"  "t_100.00000001_t"  "t_1000.00000001_t"

Тем не менее:

object.size(df)26816 bytesobject.size(df2)97208 bytes

Мои оригинальные кадры данных имеют миллионы записей, так как скорость и ограничения памяти важны.

Заранее спасибо за ваши комментарии!Кео.