2017-12-16 11 views
1

이것은 내 입력입니다.R - 한 번에 묶고 합계합니다.

df <- data.frame(n1 = c("A1", "A1", "A1", "A1", "A1", "A1", "A1"), 
       n2 = c("B", "B", "B", "B", "C", "C", "C"), 
       n3 = c("D", "D", "E", "E", "F", "G", "H"), 
       n4 = c("I", "J", "K", "L", "M", "N", "O"), 
       n5 = c(1:7), 
       n6 = c(1:7), 
       n7 = c(1:7)) 

library(dplyr) 

df <- split(df, df$n3) 

    df <- lapply(df, function(x) { 
    out <- x %>% 
    group_by() %>% 
    summarise(n1 = "", 
       n2 = "", 
       n3 = paste0(unique(n3), " Total"), 
       n4 = "", 
       n5 = sum(n5, na.rm = T), 
       n6 = sum(n6, na.rm = T), 
       n7 = sum(n7, na.rm = T)) %>% 
    ungroup() 
    bind_rows(x, out) 
}) 

df <- do.call("rbind", df) 

나는이 그림을이 그림과 같이 만들고 싶습니다. 그러나 코드를 사용하면 각 열의 그룹을 합계하고 합계합니다.

output_picture

내가 열 N1, N2, N3의 그룹으로 한 번에 행을 합계 어떻게

?

답변

1

dplyr을 사용하는 용액.

# Create example data frame 
df <- data.frame(n1 = c("A1", "A1", "A1", "A1", "A1", "A1", "A1"), 
       n2 = c("B", "B", "B", "B", "C", "C", "C"), 
       n3 = c("D", "D", "E", "E", "F", "G", "H"), 
       n4 = c("I", "J", "K", "L", "M", "N", "O"), 
       n5 = c(1:7), 
       n6 = c(1:7), 
       n7 = c(1:7), 
       stringsAsFactors = FALSE) 

library(dplyr) 

df2 <- df %>% 
    group_by(n1, n2, n3) %>% 
    summarise_at(vars(n5, n6, n7), funs(sum(.))) %>% 
    mutate(n3 = paste(n3, "Total", sep = " ")) %>% 
    bind_rows(df) %>% 
    arrange(n1, n2, n3) 

df3 <- df %>% 
    group_by(n1, n2) %>% 
    summarise_at(vars(n5, n6, n7), funs(sum(.))) %>% 
    mutate(n2 = paste(n2, "Total")) %>% 
    bind_rows(df2) %>% 
    arrange(n1, n2) 

df4 <- df %>% 
    group_by(n1) %>% 
    summarise_at(vars(n5, n6, n7), funs(sum(.))) %>% 
    mutate(n1 = paste(n1, "Total")) %>% 
    bind_rows(df3) %>% 
    arrange(n1) %>% 
    mutate_all(funs(replace(., is.na(.), ""))) %>% 
    mutate_at(vars(n1, n2), funs(ifelse(grepl("Total", n3), "", .))) %>% 
    mutate(n1 = ifelse(grepl("Total", n2), "", n1)) %>% 
    select(colnames(df)) 
df4 
# # A tibble: 15 x 7 
#   n1  n2  n3 n4 n5 n6 n7 
#  <chr> <chr> <chr> <chr> <chr> <chr> <chr> 
# 1  A1  B  D  I  1  1  1 
# 2  A1  B  D  J  2  2  2 
# 3     D Total   3  3  3 
# 4  A1  B  E  K  3  3  3 
# 5  A1  B  E  L  4  4  4 
# 6     E Total   7  7  7 
# 7   B Total     10 10 10 
# 8  A1  C  F  M  5  5  5 
# 9     F Total   5  5  5 
# 10  A1  C  G  N  6  6  6 
# 11     G Total   6  6  6 
# 12  A1  C  H  O  7  7  7 
# 13     H Total   7  7  7 
# 14   C Total     18 18 18 
# 15 A1 Total       28 28 28 
+0

오, 훌륭합니다. 하지만 B Total, C Total 및 A1 Total을 한 번에 만들 수 있습니까? 시도했지만 그 output_picture처럼 정렬하지 않습니다. –

+0

내 업데이트 된 게시물을 참조하십시오. 'df6'은 최종 출력입니다. – www

+0

니스. 하지만 당신은 열 'n3'에서 그룹을 잃었습니다. 이 경우 함수 및 for 루프를 어떻게 만들 수 있습니까? 나는 창조하는데 많은 시간을 낭비하지만 그것은 달릴 수 없다. 나는 내 지식이 그렇게 나쁘다고 생각한다. –