根据R中另一列中的条件对列进行求和

时间:2016-04-12 17:23:17

标签: r count sum

我有一个包含150多列和1000行的数据集。数据集为不同列中的各种类别的不同项目提供标记。其中一列是整个类别中每个项目的总使用量。以下是数据集的示例:

Values   A B C
1        Y   
2          Y
3        Y   Y 
4            Y 

我想使用R进行计算,以便得到以下结果:

     Count  Sum
A      2     4
B      1     2
C      2     7

基本上我想让Count Column给我一些" y"对于A,B和C,以及Sum列,每次有一个" Y"来自Usage列的总和。在A,B和C列中

第2步 - 我在200 +文件中有类似的列值。我把所有文件都放到了一个文件夹中。我想要做的是使用上述功能,将其应用于每个文件,然后按文件和类别分组答案。例如

File 1 Count A Sum A Count B Sum B Count C Sum C

File 2 Count A Sum A Count B Sum B Count C Sum C

等等

4 个答案:

答案 0 :(得分:2)

这是一个简单的(逐步)解决方案

# First, readind your data
> df <- read.table(text="Values   A  B  C
+ 1        Y  NA NA
+ 2        NA Y  NA
+ 3        Y  NA Y 
+ 4        NA NA Y ", header=TRUE)
> 
> Count <- colSums(!is.na(df[, -1]))
> Sum <- apply(!is.na(df[,-1]), 2, function(x) sum(df$Values[x]))
> data.frame(Count, Sum)
  Count Sum
A     2   4
B     1   2
C     2   7

答案 1 :(得分:2)

使用tidyrdplyr的替代方案:

library(tidyr)
library(dplyr)
df %>% gather(id, vals, -Values) %>% group_by(id) %>%
        summarise(Count = sum(vals=="Y"), 
                  Sum = sum(Values[vals=="Y"]))
#      id Count   Sum
#  (fctr) (int) (int)
#1      A     2     4
#2      B     1     2
#3      C     2     7

数据

df <- structure(list(Values = 1:4, A = structure(c(2L, 1L, 2L, 1L), .Label = c("", 
"Y"), class = "factor"), B = structure(c(1L, 2L, 1L, 1L), .Label = c("", 
"Y"), class = "factor"), C = structure(c(1L, 1L, 2L, 2L), .Label = c("", 
"Y"), class = "factor")), .Names = c("Values", "A", "B", "C"), class = "data.frame", row.names = c(NA, 
-4L))

答案 2 :(得分:1)

这是一种data.table方法。将'data.frame'转换为'data.table'(setDT(df1)),将melt转换为'long'格式,按'id'分组,获取{value'的sum是“Y”得到'计数',子集'值'对应于'值'中的“Y”元素,sum得到“总和”。

library(data.table)
melt(setDT(df1), id.var="Values", variable.name="id")[, {
           i1 <- value == "Y"
           .(Count = sum(i1), Sum = sum(Values[i1]))
           } ,  by = id]
#   id Count Sum
#1:  A     2   4
#2:  B     1   2
#3:  C     2   7

答案 3 :(得分:0)

有时最简单的方法是从旧计算中构建一个新的data.frame:

# read in data
df <- read.table(text = 'Values   A B C
                         1        Y N N 
                         2        N Y N
                         3        Y N Y 
                         4        N N Y', header = TRUE)

data.frame(Count = colSums(df[,-1] == 'Y'),    # count of "Y"s in each column
           # sum of Values column where A/B/C is "Y"
           Sum = sapply(df[,-1], function(x){sum(df$Values[x == 'Y'])}))

#   Count Sum
# A     2   4
# B     1   2
# C     2   7