Dataframe中所选列的总和和平均值

时间:2018-02-26 08:40:55

标签: r dataframe dplyr

我有下面提到的数据框:

TYPE  Type1  Con1   Type2  Con2
A     10     5      15     2
B     NA     NA     10     3
C     20     10     NA     NA
D     5      5      15     3

我想要第2列和第4列以及第3列和第5列的意思,我试过这个New_DF<-rbind(DF[-1],c(colSums(DF[,c(2,4)],colMeans(DF[,c(3,5)])))),但它无法正常工作。

期望的输出:

TYPE    Type1  Con1   Type2  Con2
A       10     5      15     2
B       NA     NA     10     3
C       20     10     NA     NA
D       5      5      15     3
Total   35     5      40     2

2 个答案:

答案 0 :(得分:1)

E.g。这样

df <- data.frame(Type  = c("A", "B", "C", "D"),
                 Type1 = c(10, NA, 20, 5),
                 Con1  = c(5, NA, 10, 5),
                 Type2 = c(15, 10, NA, 15),
                 Con2  = c(2, 3, NA, 3), stringsAsFactors = F)

rbind(df, c("Total", colSums(df[, 2:5], na.rm = TRUE) / rep(c(1, nrow(df)), 2)))

   Type Type1 Con1 Type2 Con2
1     A    10    5    15    2
2     B  <NA> <NA>    10    3
3     C    20   10  <NA> <NA>
4     D     5    5    15    3
5 Total    35    5    40    2

答案 1 :(得分:0)

首先,将NA替换为0。

dat2 <- dat
dat2[is.na(dat2)] <- 0

之后,使用sapply根据列名将sum或mean应用于不同的列。

result <-  sapply(names(dat2[, -1]), function(x){
  if (grepl("Type", x)){
    return(sum(dat2[, -1][[x]]))
  } else if (grepl("Con", x)){
    return(mean(dat2[, -1][[x]]))
  }
})

然后合并结果。

dat3 <- data.frame(t(result))
dat3$TYPE <- "Total"

dat4 <- rbind(dat, dat3)
dat4
#    TYPE Type1 Con1 Type2 Con2
# 1     A    10    5    15    2
# 2     B    NA   NA    10    3
# 3     C    20   10    NA   NA
# 4     D     5    5    15    3
# 5 Total    35    5    40    2

数据

dat <- read.table(text = "TYPE  Type1  Con1   Type2  Con2
A     10     5      15     2
                  B     NA     NA     10     3
                  C     20     10     NA     NA
                  D     5      5      15     3",
                  header = TRUE, stringsAsFactors = FALSE)