Возможно ли при помощи цикла for создать несколько баз данных?
столкнулся с тем, что нужно загрузить n-ое количество баз данных для последующей обработки в R. Есть ли возможность сделать это при помощи цикла for?
Если делать всё ручками (без цикла) то выглядит это так:
d1 = read.spss("r28iall_32.sav", to.data.frame=TRUE, use.value.labels=FALSE)
d2 = read.spss("r27iall_32.sav", to.data.frame=TRUE, use.value.labels=FALSE)
d3 = read.spss("r26iall_32.sav", to.data.frame=TRUE, use.value.labels=FALSE)
# и т.д.
Понимая, что изменяется лишь одна цифра, создаю следующий вектор:
c2 = c(9:28)
c2[1]='09'
c3 = c(rep("r",20))
c4 = c(rep("iall_32.sav",20))
g = rev(sort(paste0(c3,c2,c4)))
Который принимает значения:
[1] "r28iall_32.sav" "r27iall_32.sav" "r26iall_32.sav" "r25iall_32.sav" "r24iall_32.sav" "r23iall_32.sav" "r22iall_32.sav" "r21iall_32.sav"
[9] "r20iall_32.sav" "r19iall_32.sav" "r18iall_32.sav" "r17iall_32.sav" "r16iall_32.sav" "r15iall_32.sav" "r14iall_32.sav" "r13iall_32.sav"
[17] "r12iall_32.sav" "r11iall_32.sav" "r10iall_32.sav" "r09iall_32.sav"
Создаю цикл:
d = NULL
for (i in (1:20)) {
d = read.spss(g[i], to.data.frame=TRUE, use.value.labels=FALSE)
}
и естественно он возвращает только последнюю 20-ю базу. Подскажите, пожалуйста, каким образом можно каждый раз записывать эти базы в раздел data, чтобы в итоге получить d1,d2,d3 и т.д.?
Ответы (2 шт):
если уж очень нужно, то можно, конечно, создавать переменные динамически, например, с помощью функции assign():
> for (i in 1:3) { n <- paste('d', i, sep=''); assign(n, i + 10) }
> d1
[1] 11
> d2
[1] 12
> d3
[1] 13
но гораздо логичнее будет использовать список для хранения массива неоднотипных значений (в вашем случае — массива наборов данных):
> d <- list()
> for (i in 1:3) { d[[i]] <- as.data.frame(array(1:(i*i),c(i,i))) }
> d
[[1]]
V1
1 1
[[2]]
V1 V2
1 1 3
2 2 4
[[3]]
V1 V2 V3
1 1 4 7
2 2 5 8
3 3 6 9
Если Ваши данные однотипны, то можно немного дополнить Ваше решение:
df=data.frame()
for (i in (1:20)) {
d = read.spss(g[i], to.data.frame=TRUE, use.value.labels=FALSE)
d$database=g[i] # присваиваем название базы, из которой взяли данные
df=rbind(df,d) # или plyr::rbind.fill(df,d) в случае, если число колонок не совпадает
}
rm(d)