2017-12-16 8 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'のグループを失った。この場合、関数とループをどのように作成できますか?私は創造するのに多くの時間を無駄にするが、それは動くことができない。私の知識はとても悪いと思う。 –

関連する問題