2013-10-18 20 views
6

tôi có một loạt các khung dữ liệu, df1df2, trong đó mỗi khung dữ liệu theo cấu trúc này:Looping thông qua danh sách các khung dữ liệu trong R

x <- c(1:5) 
y <- c(1:5) 
df1 <- data.frame("Row One"=x, "Row Two"=y) 

đầu ra mẫu cho df1:

Row.One Row.Two 
    1   1 
    2   2 
    3   3 
    4   4 
    5   5 

tôi đặt mỗi khung dữ liệu vào một danh sách dfList <- list(df1,df2...)

Bây giờ tôi muốn lặp qua từng đối tượng khung dữ liệu trong danh sách này để thay thế các tên cột trong usin g lệnh này:

a <- grep("One", colnames(df)) 
b <- grep("Two", colnames(df)) 

names(df)[a] <- "R1" 
names(df)[b] <- "R2" 

Làm thế nào tôi có thể cấu trúc một vòng lặp trong R vì vậy mà tôi dù có bao nhiêu dữ liệu khung nằm trong danh sách các đối tượng tên cột thay đổi lệnh trên sẽ được áp dụng cho mỗi khung dữ liệu?

Trả lời

6
> df1 <- data.frame("Row One"=x, "Row Two"=y) 
> df2 <- data.frame("Row Two"=y,"Row One"=x) 
> dfList <- list(df1,df2) 
> lapply(dfList, function(x) { 
        names(x)[ grep("One", names(x))] <- "R1" 
        names(x)[ grep("Two", names(x))] <- "R2" 
        x}) 
[[1]] 
    R1 R2 
1 1 1 
2 2 2 
3 3 3 
4 4 4 
5 5 5 

[[2]] 
    R2 R1 
1 1 1 
2 2 2 
3 3 3 
4 4 4 
5 5 5 
+0

Điều này hoạt động tốt nhưng khi tôi gọi 'dflist [[1]] 'nó vẫn hiển thị" Hàng Một "thay vì" R1 ". Tại sao thay đổi chỉ xuất hiện trên bảng điều khiển khi tôi chạy lệnh 'lapply' nhưng không tự cập nhật khung dữ liệu? Tôi có làm điều gì sai? – AME

+1

Nếu bạn không assgn kết quả cho một đối tượng được đặt tên nó "biến mất". Nếu bạn muốn nó thay thế dfList, bạn cần sử dụng 'dfList <-'. –

4

Chỉ cần sử dụng length(dfList)?

for(i in 1:length(dfList)) 
{ 
    a <- grep("One", names(dfList[[i]])) 
    ... #etc. 
} 

Sử dụng lapply sẽ nhanh hơn.

ChangeNames = function(Data) 
{ 
    a = grep("One", names(Data)) 
    b = grep("Two", names(Data)) 
    names(Data)[c(a,b)] <- c("R1", "R2") 
    return(Data) 
} 
lapply(dfList, ChangeNames) #Returns list of renamed data frames. 
+0

Điều này cũng có tác dụng nếu "a" là trống rỗng? Có vẻ như nó sẽ gán "R1" thành "b". – Frank

+0

Không, không. OP chỉ muốn lệnh đó được áp dụng cho mọi khung dữ liệu trong danh sách. –

+0

OK. Tôi thường thấy grep như một điều kiện ("Nếu tôi tìm thấy expr ..."), nhưng, yeah, OP dường như biết sẽ có một trận đấu cho mỗi người. – Frank

3

Hoặc sử dụng llply (từ plyr) hoặc lapply như vậy:

library(plyr) 
result_list <- llply(list_of_df, function(x) { 
       # do the replacing 
       return(x) 
       }) 
Các vấn đề liên quan