2013-05-23 30 views
5

Tôi đang tìm kiếm một cách để tự động hóa một số sơ đồ trong R bằng một for loop:Vòng qua khung dữ liệu và tên biến

dflist <- c("dataframe1", "dataframe2", "dataframe3", "dataframe4") 

for (i in dflist) { 
    plot(i$var1, i$var2) 
} 

Tất cả dataframes có các biến tương tự, ví dụ: var1, var2.

Có vẻ như các vòng for không phải là giải pháp thanh lịch nhất ở đây, nhưng tôi không hiểu cách sử dụng các hàm apply cho biểu đồ.

EDIT:

dụ ban đầu của tôi sử dụng mean() không giúp đỡ trong câu hỏi ban đầu, vì vậy tôi đã thay đổi nó vào một chức năng cốt truyện.

+2

Sử dụng một 'vòng for' là tốt. Chỉ cần đặt data.frames thực tế trong một danh sách chứ không chỉ tên của chúng trong một vectơ. Để dễ đọc hơn, bạn cũng có thể thay đổi nội dung vòng lặp thành 'lô (var2 ~ var1, data = i)'. Tuy nhiên, bạn có thể muốn lưu các ô (đọc '? Pdf') hoặc đặt một số ô trên một trang đồ thị (đọc'? Par'). – Roland

+0

Mặc dù tôi đồng ý với Roland rằng đối với vòng lặp là tốt, ví dụ này với một danh sách các data.frame là một thực sự tốt phù hợp cho lapply. –

+0

@arumbay Tôi cũng sẽ kiểm tra mặt trong gói 'ggplot2' để tạo nhóm các ô. –

Trả lời

9

Tiếp tục thêm vào câu trả lời của Beasterfield, nó có vẻ như bạn muốn làm một số số hoạt động phức tạp trên mỗi khung dữ liệu.

Có thể có các hàm phức tạp trong câu lệnh áp dụng. Vì vậy, nơi bây giờ bạn có:

for (i in dflist) { 
    # Do some complex things 
} 

này có thể được dịch sang:

lapply(dflist, function(df) { 
    # Do some complex operations on each data frame, df 
    # More steps 

    # Make sure the last thing is NULL. The last statement within the function will be 
    # returned to lapply, which will try to combine these as a list across all data frames. 
    # You don't actually care about this, you just want to run the function. 
    NULL 
}) 

Một ví dụ cụ thể hơn bằng cốt truyện:

# Assuming we have a data frame with our points on the x, and y axes, 
lapply(dflist, function(df) { 
    x2 <- df$x^2 
    log_y <- log(df$y) 
    plot(x,y) 
    NULL 
}) 

Bạn cũng có thể viết các chức năng phức tạp mà mất nhiều tranh cãi :

lapply(dflist, function(df, arg1, arg2) { 
    # Do something on each data.frame, df 
    # arg1 == 1, arg2 == 2 (see next line) 
}, 1, 2) # extra arguments are passed in here 

Hy vọng điều này sẽ giúp bạn!

+0

Cảm ơn bạn, điều đó rất hữu ích và giúp tôi hiểu rõ hơn nguyên tắc đằng sau các chức năng áp dụng! –

6

Liên quan đến câu hỏi thực tế của bạn, bạn nên tìm hiểu cách truy cập các ô, hàng và cột của data.frame s, matrix s hoặc list s. Từ mã của bạn tôi đoán bạn muốn truy cập vào j 'th cột của data.frame i, vì vậy nó nên đọc:

mean(i[,j]) 
# or 
mean(i[[ j ]]) 

Nhà điều hành $ có thể chỉ được sử dụng nếu bạn muốn truy cập một biến đặc biệt trong bạn data.frame, vd i$var1. Ngoài ra, nó kém hiệu quả hơn truy cập theo số [, ] hoặc [[]].

Tuy nhiên, mặc dù không sai, việc sử dụng vòng for không phải là rất R'ish. Bạn nên đọc về các chức năng được vector hóa và họ apply. Vì vậy, mã của bạn có thể dễ dàng viết lại như:

set.seed(42) 
dflist <- vector("list", 5) 
for(i in 1:5){ 
    dflist[[i]] <- data.frame(A = rnorm(100), B = rnorm(100), C = rnorm(100)) 
} 
varlist <- c("A", "B") 

lapply(dflist, function(x){ colMeans(x[varlist]) }) 
+0

Cảm ơn - Tôi e rằng ví dụ() của tôi sẽ quá đơn giản. Tôi đang tìm một cách để tự động tạo ra các phân tán đề cập đến một tập hợp các khung dữ liệu (xem các thay đổi trong ví dụ trên); Tôi đoán điều này cũng có thể sử dụng các hàm áp dụng? –

1
set.seed(42) 
dflist <- list(data.frame(x=runif(10),y=rnorm(10)), 
       data.frame(x=rnorm(10),y=runif(10))) 

par(mfrow=c(1,2)) 
for (i in dflist) { 
    plot(y~x, data=i) 
} 
2

Sử dụng ví dụ về @Roland, tôi muốn hiển thị cho bạn số ggplot2 tương đương. Đầu tiên chúng ta phải thay đổi datset một chút:

đầu tiên dữ liệu gốc:

> dflist 
[[1]] 
      x   y 
1 0.9148060 -0.10612452 
2 0.9370754 1.51152200 
3 0.2861395 -0.09465904 
4 0.8304476 2.01842371 
5 0.6417455 -0.06271410 
6 0.5190959 1.30486965 
7 0.7365883 2.28664539 
8 0.1346666 -1.38886070 
9 0.6569923 -0.27878877 
10 0.7050648 -0.13332134 

[[2]] 
      x   y 
1 0.6359504 0.33342721 
2 -0.2842529 0.34674825 
3 -2.6564554 0.39848541 
4 -2.4404669 0.78469278 
5 1.3201133 0.03893649 
6 -0.3066386 0.74879539 
7 -1.7813084 0.67727683 
8 -0.1719174 0.17126433 
9 1.2146747 0.26108796 
10 1.8951935 0.51441293 

và đưa dữ liệu vào một dữ liệu.khung hình, với một cột id

require(reshape2) 
one_df = melt(dflist, id.vars = c("x","y")) 
> one_df 
      x   y L1 
1 0.9148060 -0.10612452 1 
2 0.9370754 1.51152200 1 
3 0.2861395 -0.09465904 1 
4 0.8304476 2.01842371 1 
5 0.6417455 -0.06271410 1 
6 0.5190959 1.30486965 1 
7 0.7365883 2.28664539 1 
8 0.1346666 -1.38886070 1 
9 0.6569923 -0.27878877 1 
10 0.7050648 -0.13332134 1 
11 0.6359504 0.33342721 2 
12 -0.2842529 0.34674825 2 
13 -2.6564554 0.39848541 2 
14 -2.4404669 0.78469278 2 
15 1.3201133 0.03893649 2 
16 -0.3066386 0.74879539 2 
17 -1.7813084 0.67727683 2 
18 -0.1719174 0.17126433 2 
19 1.2146747 0.26108796 2 
20 1.8951935 0.51441293 2 

và làm cho cốt truyện:

require(ggplot2) 
ggplot(one_df, aes(x = x, y = y)) + geom_point() + facet_wrap(~ L1) 

enter image description here

Các vấn đề liên quan