2013-05-23 2 views
5

을 통해 내가 루프를 사용하여 R의 일부 다이어그램을 자동화하는 방법을 찾고 있어요 :루프 데이터 프레임 및 변수 이름

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

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

모든 dataframes 같은 변수, 즉 VAR1, VAR2가 있습니다.

여기서는 가장 좋은 해결책이 for 인 것처럼 보이지만 다이어그램에 apply 함수를 사용하는 방법을 이해하지 못합니다.

편집 :

mean() 그래서 난 플롯 기능을 변경, 원래의 질문에 도움이되지 않았다 사용하여 내 원래 예.

+2

앞에'for' 루프를 사용 괜찮다. 실제 data.frames를 벡터에있는 이름이 아닌 목록에 넣기 만하면됩니다. 더 읽기 쉽도록 루프 내용을'plot (var2 ~ var1, data = i)'로 변경할 수도 있습니다. 그러나, 그래프를 저장하거나 ('? pdf'를 읽으십시오), 또는 하나의 그래프 페이지 ('? par'를 읽습니다)에 여러 개의 그림을 넣을 수 있습니다. – Roland

+0

롤업에 대해서는 for 루프가 괜찮다는 것에 동의하지만,이 예제의 data.frame 목록은 lapply에 적합합니다. –

+0

@arumbay'ggplot2' 패키지에서 패싯 (facet) 그룹을 만들기 위해 패싯 (facetting)을 체크 아웃합니다. –

답변

9

더 Beasterfield의 대답에 추가하려면, 그것은 보인다.

apply 명령문 내에서 복잡한 기능을 사용할 수 있습니다. 그래서 당신은 지금이 여기서

# 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 
}) 

당신은 여러 인수를 복잡한 기능을 쓸 수 있습니다 : 플롯을 사용하여

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 
}) 

더 구체적인 예 :

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

는 이것은로 번역 할 수 있습니다 :

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 

희망이 당신을 도와줍니다!

+0

감사합니다. 매우 도움이되었고 적용 기능의 원리를 더 잘 이해할 수있었습니다. –

6

실제 질문에 대해서는 data.frame, matrix 또는 list의 셀, 행 및 열에 액세스하는 방법을 배워야합니다. 코드에서 나는 당신이 data.frame i의 열 번째 j '를 액세스하려는 생각, 그래서 읽어야 당신이 특정 변수에 액세스하려면

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

$ 연산자 만 사용 할 수 있습니다 data.frame, 예. i$var1. 또한 [, ] 또는 [[]]으로 액세스하는 것보다 성능이 떨어집니다.

그러나 잘못이 아니지만 for 루프는 매우 R'ish가 아닙니다. 벡터화 된 함수와 apply 패밀리에 대해 읽어야합니다. 그래서 코드가 쉽게로 다시 작성할 수 있습니다 : 당신은 데이터 프레임의 각 복잡한 작업의 어떤 수를하고 싶은처럼

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

감사합니다. 내 mean() 예제가 너무 단순 할까 봐 걱정했습니다. 데이터 프레임 집합을 참조하는 scatterplots을 자동으로 생성하는 방법을 찾고 있습니다 (위 예제의 변경 내용 참조). 나는 이것도 적용 함수를 사용하여 가능한 것 같아요? –

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

@Roland의 예를 사용하여 ggplot2에 해당하는 것을 보여 드리고자합니다.

먼저 원본 데이터 :

> 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 

와 하나의 데이터에 데이터를 넣어 먼저 우리는 datset을 약간 변경해야합니다.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 

및 플롯을 프레임 :

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

enter image description here