2011-08-19 11 views
5

Tôi đang cố gắng biên dịch dữ liệu từ một số tệp bằng cách sử dụng vòng lặp trong R. Tôi muốn lấy tất cả dữ liệu vào một bảng. Tính toán sau đây chỉ là một ví dụ.Vòng lặp R: Thêm một cột vào bảng nếu chưa tồn tại

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) 

Cách tốt nhất để thêm cột bổ sung vào dat2 là gì? Tôi muốn nhận được cùng một tên cột ("Density_3" trong trường hợp này) và điền nó với số không, nếu nó không tồn tại. Giả sử rằng tôi có ~ 100 bảng với số lượng cột (Density_1, 2, 3 vv) thay đổi từ 5 đến 6.

tôi đã cố gắng sau, nhưng nó đã không làm việc:

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

Một số khác: là có một cách trơn tru để rbind() các bảng? Dường như rbind (get (dat)) không hoạt động.

Trả lời

3

Sau khi nhìn chằm chằm vào câu hỏi này một lúc, tôi nghĩ ý định của nó có thể bị che khuất bởi các thao tác không cần thiết getassign. Và tôi nghĩ rằng câu trả lời là pylr::rbind.fill

Tôi đã xây dựng "dat", không phải là vectơ ký tự nhưng là danh sách hai dataframes, được sử dụng aggregate(..., FUN=mean) (vì tôi chưa nhận được trên xe buýt reshape2/plyr, ngoại trừ meltrbind.fill có nghĩa là) và sau đó do.call(rbind.fill, ...) trên danh sách kết quả. Dù sao thì đây là điều tôi nghĩ bạn muốn. Tôi không nghĩ rằng nó là một ý tưởng tốt để thêm vào số không cho những gì đang thực sự mất tích giá trị.

> 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 
+0

Không biết về lệnh rbind.fill(). Đó là cái tôi đang tìm kiếm. Cảm ơn! – Largh