2017-11-13 4 views
1

나는 한 열의 값을 다른 열의 값으로 정렬하여 data.frame을 취합하고 집계하려고하며 마지막 열의 값이 특정 기준. SQL에서는 간단한 Group By를 사용하고 루프를 작성했지만 R에서 시작하고 구문을 파악하는 데 어려움을 겪고 있습니다.R의 합계 값 두 개의 숫자 사이에있는 열의 값

Type Type2 Bucket Value 
    A 1  1  1 
    A 2  1  2 
    A 3  1  1 
    A 4  1  3 
    A 5  1  1 
    A 1  2  1 
    A 2  2  2 
    A 3  2  1 
    A 4  2  3 

내가 출력 이런 식으로 뭔가가되고 싶어요 : 나는 기본적으로는 다음과 같습니다 데이터 세트가

내 머리에서
Type Type2 Bucket Value 
A  <4  1  4 
A  >=4  1  4 
A  <4  2  5 
A  >=4  2  3 

, 그것은 쉽게,하지만 나는 SQL 배경에서 간다 , 그리고 R에서 그것을 시도하고 있습니다. 나는 분할과 ddply 같은 성공의 비트와 함께 몇 가지 기능을 엉망으로 만들었지 만, 그것을 모두 함께 넣어 수 없습니다. 감사.

+0

경우'당신의 출력의 3 행해야 –

+0

을 sqldf'처럼, 당신은 dplyr' 또는 무언가 이상의 SQL-Y '집에서 느낄 수있는' 값 = 4' 대신'5'를 사용합니까? – useR

+0

도움 주셔서 감사합니다! 예, 5 대신 4가되어야합니다. 나는 숫자를 망설이고 이것을 바꾸는 것을 잊어 버렸지 만 개념은 동일합니다. –

답변

1

dplyr으로이를 수행 할 수 있습니다.

library(dplyr) 

df %>% 
    group_by(Type, Bucket, Type2 = ifelse(Type2 < 4, "<4", ">=4")) %>% 
    summarize(Value = sum(Value)) %>% 
    select(Type, Type2, Bucket, Value) 

결과 :

library(sqldf) 

sqldf("select Type, 
       case when Type2 < 4 then '<4' else '>=4' end as Type_2, 
       Bucket, 
       sum(Value) as Value 
      from df 
      group by Type, Bucket, Type_2") 

: 당신은 당신이 SQL 배경을 언급 한 이후

# A tibble: 4 x 4 
# Groups: Type, Bucket [2] 
    Type Type2 Bucket Value 
    <fctr> <chr> <int> <int> 
1  A <4  1  4 
2  A >=4  1  4 
3  A <4  2  4 
4  A >=4  2  3 

, 여기 당신을위한 sqldf 솔루션입니다 개 이상의 Type을 가정 결과 :

Type Type_2 Bucket Value 
1 A  <4  1  4 
2 A >=4  1  4 
3 A  <4  2  4 
4 A >=4  2  3 

데이터 : 당신의 배경이 SQL은

df = structure(list(Type = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L), .Label = "A", class = "factor"), Type2 = c(1L, 2L, 3L, 
4L, 5L, 1L, 2L, 3L, 4L), Bucket = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L), Value = c(1L, 2L, 1L, 3L, 1L, 1L, 2L, 1L, 3L)), .Names = c("Type", 
"Type2", "Bucket", "Value"), class = "data.frame", row.names = c(NA, 
-9L)) 
관련 문제