2016-09-01 4 views
4

R에서 dplyr 구문을 사용하여 작성한 광범위한 코드 블록이 있습니다. 그러나 루프에 해당 코드를 넣으려고합니다. 궁극적으로 하나의 파일이 아닌 여러 개의 출력 파일을 만들 수 있습니다. 불행히도 그렇게 할 수없는 것처럼 보입니다. 내 문제에 대한 설명을 위해dplyr 구문을 사용하여 "for"루프에서 "for"루프를 작성하는 방법

,의는 R에서 일반적으로 사용되는 "아이리스"데이터 세트를 참조하자

 > data("iris") 
     > str(iris) 
     'data.frame': 150 obs. of 5 variables: 
     $ Sepal.Length: num 
     $ Sepal.Width : num 
     $ Petal.Length: num 
     $ Petal.Width : num 
     $ Species  : Factor w/ 3 levels "setosa","versicolor","virginica" 

이의 내가 종 "베르"의 평균 Petal.Length을 저장할한다고 가정 해 봅시다. dplyr 코드는 다음과 같이 수 : 다음과 같은 값을 줄 것

MeanLength2 <- iris %>% filter(Species=="versicolor") 
         %>% summarize(mean(Petal.Length)) %>% print() 

:

 mean(Petal.Length) 
    1    4.26 

는 종의 모든 평균 꽃잎의 길이를 얻을 수있는 루프를 만드는 시도를 할 수 있습니다.

내가 루프 알고 작은 것과

, 나는 이런 식으로 뭔가를 할 것이다 : 어떤 이유

 for (i in unique(iris$Species)) 
     { 
     iris %>% filter(iris$Species==unique(iris$Species)[i]) %>% 
     summarize(mean(iris$Petal.Length)) %>% print() 
     print(i) 
     } 

을, 나는 데이터 프레임 일반적으로하지 않습니다 루프 내부의 열을 지정했다 케이스는 dplyr의 배관 기능을 사용하는 동안. 나는 이것이 문제의 지표라고 가정하고 있습니다.

  mean(iris$Petal.Length) 
    1     3.758 
    [1] "setosa" 
      mean(iris$Petal.Length) 
    1     3.758 
    [1] "versicolor" 
      mean(iris$Petal.Length) 
    1     3.758 
    [1] "virginica" 

그래서 코드 3.758 세 번 출력되고, 데이터 세트 내의 모든 종에 걸쳐 평균 꽃잎 길이 :

여하튼, 상기 코드는 다음과 같은 출력을 제공한다. 이것은 "필터"코드가 예상대로 작동하지 않음을 나타냅니다. 내가 알 수 있듯이, 루프 자체가 의도 한대로 작동하는 것처럼 보입니다. 세 개의 고유 한 종 이름이 모두 최종 결과물에 인쇄 되었기 때문입니다.

for 루프를 사용하여 어떻게 이런 일을 할 수 있습니까? 이 특별한 연습에서는 예를 들어 dplyr의 "group_by"함수를 사용하여 모든 종의 평균 꽃잎 길이를 쉽게 얻을 수 있으므로 환상적인 루프를 사용하지 않아도된다는 것을 이해합니다. 100 개의 고유 한 테이블과 PDF 파일은 내가 작업하고있는 데이터 세트를 가지고 있고 루프를 사용하는 방법을 아는 것은 그 목적에 도움이 될 것입니다. 난 당신이 정말 결과가 분리해야하는 경우, 아마 group_by를 사용하는 것이 더 쉬울 것이다, 내 댓글에서 언급 한 바와 같이

+0

도움이되기를 바랍니다 group_by'를 만든 다음 결과를 원하는 조각마다 요소가있는 목록으로'split() '합니다. – joran

+0

아래 코드를 보내 주셔서 감사합니다. 데이터 세트가이 질문에 대해 참조한 홍채 데이터보다 더 복잡하지만 필자가 권장하는 작업 흐름을 활용하여 내가 원하는 것을 할 수 있다고 생각합니다. –

+0

for-loop 내부는'iris %> % filter (Species == i) %> % summarize (평균 (Petal.Length)) %> % print()'이어야합니다. 그러면 각 종마다 다른 수를 만들어 낼 것입니다. –

답변

5

다음 split() 결과 :

iris %>% 
    group_by(Species) %>% 
    summarise(mn = mean(Petal.Length)) %>% 
    split(.,.$Species) 

$setosa 
# A tibble: 1 × 2 
    Species mn 
    <fctr> <dbl> 
1 setosa 1.462 

$versicolor 
# A tibble: 1 × 2 
    Species mn 
     <fctr> <dbl> 
1 versicolor 4.26 

$virginica 
# A tibble: 1 × 2 
    Species mn 
    <fctr> <dbl> 
1 virginica 5.552 
3

당신의 코드를하지 않았다 불행한 일이다 오류를 제기하십시오. 코드를 한 줄씩 실행하면 내가 말하는 것을 이해할 수 있습니다.

> iris %>% filter(iris$Species == unique(iris$Species)["setosa"]) 
[1] Sepal.Length Sepal.Width Petal.Length Petal.Width Species  
<0 rows> (or 0-length row.names) 

귀하의 필터가없는 관찰과 데이터 프레임, 너무 앞서가는 어떤 점을 얻을 수 있지만, 예를 들어, 실행하자 :이 예를 들어 나는 당신의 루프의 첫 번째 반복을 선택합니다,의는 "setosa"에 대한 i을 대체 할 수 나머지 코드 : 당신은 당신의 코드 내에서 iris 데이터 세트를 호출하고 있다는

> iris %>% filter(iris$Species == unique(iris$Species)["setosa"]) %>% 
+ summarize(mean(iris$Petal.Length)) 
    mean(iris$Petal.Length) 
1     3.758 

무슨 일이 있었는지는 좀 더 분명한 예는 다음과 같습니다

> filter(iris, iris$Species == unique(iris$Species)["setosa"]) %>% 
+ summarize(mean(mtcars$cyl)) 
    mean(mtcars$cyl) 
1   6.1875 

그 이유는 예상했던 답변을 얻지 못하고 필터가 작동하지 않고 다른 데이터 세트에서 요약 통계를 얻었 기 때문입니다.

TJ 마하가 언급 한 바와 같이

는 데이터 집합을 지정하지 않고 코드가 잘 실행 :

> for (i in unique(iris$Species)) 
+ { 
+  iris %>% filter(Species==i) %>% 
+   summarize(mean(Petal.Length)) %>% print() 
+  print(i) 
+ } 
    mean(Petal.Length) 
1    1.462 
[1] "setosa" 
    mean(Petal.Length) 
1    4.26 
[1] "versicolor" 
    mean(Petal.Length) 
1    5.552 
[1] "virginica" 

난 당신이 정말 각 그룹에 대해 별도의 오브젝트를해야하는 경우는 아마`사용하는 것이 더 간단 할 것이

관련 문제