2016-10-24 3 views
4

다음 I 데이터 집합을 가지고 I 생각할 수R : 다른 열을 기준으로 행의 값을 뺀다

Group Diff 
    A  500 
    B  -500 
    C  700 
    D  -600 

한 방법은 분리가있다 : 다음

Group Type Income 
A  X  1000 
A  Y  500 
B  Y  2000 
B  X  1500 
C  X  700 
D  Y  600 

는 I 출력 필요 유형 X 및 Y가있는 데이터를 입력 한 다음 X 또는 Y가없는 그룹에 대해 소득을 0으로 추가 한 다음 각 그룹에 대한 데이터를 병합하는 경우 IncomeX라는 열과 IncomeY라는 열이있는 경우 두 개의 열을 뺍니다.

더 쉬운 방법이 있나요?

답변

4

나는 이런 식으로 할 것 : (dplyrreshape2 패키지를 사용)

library("dplyr") 
library("reshape2") 

t <- read.table(text = "Group Type Income 
A  X  1000 
       A  Y  500 
       B  Y  2000 
       B  X  1500 
       C  X  700 
       D  Y  600", header = TRUE) 

t %>% 
    dcast(Group ~ Type, value.var = "Income", fill = 0) %>% 
    mutate(Diff = X - Y) %>% 
    select(Group, Diff) 

# Group Diff 
# 1  A 500 
# 2  B -500 
# 3  C 700 
# 4  D -600 

dcast 테이블의 형식을 변경하고 mutate는 새 열을 만듭니다.

1

data.table을 사용할 수 있습니다. 'data.frame'을 'data.table'(setDT(df1))로 변환하고 '유형'이 'Y'이고 '소득'을 음수 값으로 변환 한 다음 '그룹'별로 그룹화하면 '소득'이 sum이됩니다.

library(data.table) 
setDT(df1)[Type == "Y", Income := -1 * Income][, .(Diff= sum(Income)) , Group] 
# Group Diff 
#1:  A 500 
#2:  B -500 
#3:  C 700 
#4:  D -600 

또는 함께 tidyr/dplyr

library(dplyr) 
library(tidyr) 
spread(df1, Type, Income, fill = 0) %>% 
       transmute(Group, Diff = X- Y) 
# Group Diff 
#1  A 500 
#2  B -500 
#3  C 700 
#4  D -600 
3

기본 R이 시도 :

aggregate(Diff~Group, 
      with(df, data.frame(Group=Group, Diff=ifelse(Type=="X", 1, -1)*Income)), sum) 

# Group Diff 
#1  A 500 
#2  B -500 
#3  C 700 
#4  D -600 

데이터

df <- structure(list(Group = structure(c(1L, 1L, 2L, 2L, 3L, 4L), .Label = c("A", 
"B", "C", "D"), class = "factor"), Type = structure(c(1L, 2L, 
2L, 1L, 1L, 2L), .Label = c("X", "Y"), class = "factor"), Income = c(1000L, 
500L, 2000L, 1500L, 700L, 600L)), .Names = c("Group", "Type", 
"Income"), class = "data.frame", row.names = c(NA, -6L)) 
관련 문제