Циклы R: добавление столбца в таблицу, если он еще не существует - PullRequest
5 голосов
/ 19 августа 2011

Я пытаюсь скомпилировать данные из нескольких файлов, используя циклы for в R. Я хотел бы собрать все данные в одну таблицу.Следующие расчеты являются лишь примером.

library(reshape)

dat1 <- data.frame("Specimen" = paste("sp", 1:10, sep=""), "Density_1" = rnorm(10,4,2), "Density_2" = rnorm(10,4,2), "Density_3" = rnorm(10,4,2))
dat2 <- data.frame("Specimen" = paste("fg", 1:10, sep=""), "Density_1" = rnorm(10,4,2), "Density_2" = rnorm(10,4,2))

dat <- c("dat1", "dat2")
for(i in 1:length(dat)){
data <- get(dat[i])
melt.data <- melt(data, id = 1)
assign(paste(dat[i], "tbl", sep=""), cast(melt.data, ~ variable, mean))
}

rbind(dat1tbl, dat2tbl)

Какой самый плавный способ добавить дополнительный столбец в dat2?Я хотел бы получить то же имя столбца (в данном случае «Density_3») и заполнить его нулями, если он еще не существует.Предположим, что у меня ~ 100 таблиц с числом столбцов (Density_1, 2, 3 и т. Д.) От 5 до 6.

Я пробовал следующее, но это не сработало:

if(names(data) %in% "Density_3" == FALSE){
dat.all$Density_3 <- 0
} else {
dat.all$Density_3 <- dat.all$Density3}

Еще один: есть ли плавный способ rbind () таблиц?Похоже, что rbind (get (dat)) не работает.

1 Ответ

3 голосов
/ 19 августа 2011

Посмотрев на этот вопрос некоторое время, я думаю, что его намерение, возможно, было скрыто из-за ненужных манипуляций get и assign.И я думаю, что ответом будет pylr::rbind.fill

. Я бы построил «dat» не как символьный вектор, а как список из двух информационных фреймов, используя aggregate( ..., FUN=mean) (потому что я не попал в reshape2/ plyr bus, за исключением melt и rbind.fill, а затем do.call(rbind.fill, ...) в результирующем списке.Во всяком случае, это то, что я думаю, вы хотите.Я не думаю, что было бы хорошей идеей добавлять в нули то, что действительно пропускает значения.

> rbind.fill(dat1tbl, dat2tbl)
  value Density_1 Density_2 Density_3
1 (all)  5.006709  4.088988  2.958971
2 (all)  4.178586  3.812362        NA
...