我有一个包含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
等等
答案 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)
使用tidyr
和dplyr
的替代方案:
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