我正在遍历数据框中的列(它也是我代码中的数据表)。在SQL中,相当于我想对每个变量做的事情如下:
SELECT COUNT(VAR) FROM df GROUP BY MonthYear
但是,我在R中做某事时遇到了一些麻烦。我的文件结构很差,所以我有一些dplyr
+ data.table
解决方法,我正在尝试使用。
library(dplyr)
library(data.table)
df <- data.frame(MonthYear = c("JAN15", "JAN15", "FEB15", "MAR15", "MAR15"), V1 = c(1,1,0,0,0), V2 = c(0,1,1,1,0), V3 = c(0,0,0,1,1), V4 = c(0,1,1,1,1))
for(colNum in 2:length(names(df))){
colName <- names(df)[colNum]
filtered <- select(df, c(1, colNum))
filtered_dt <- data.table(filtered, key = "MonthYear")
trimmed <- filtered_dt[, count = sum(colName), by = key(filtered_dt)]
}
导致错误:
sum(列)中的错误:参数
的'type'(字符)无效
对于V1
,我知道trimmed
分配应如下所示:
trimmed <- filtered_dt[, count = sum(V1), by = key(filtered_dt)]
我只是不知道如何获得"V1"
的字符值以适合该语法。
答案 0 :(得分:3)
问题令人困惑,您在代码中使用SQL count(var)
,并提供了示例,您似乎想要使用sum(var)
。使用count(var)
将计算所有非NULL元素,包括重复元素
假设您希望按月sum
变量,那么迈克尔评论中的解决方案就是高效而干净的答案:
library(data.table)
df <- data.frame(MonthYear = c("JAN15", "JAN15", "FEB15", "MAR15", "MAR15"), V1 = c(1,1,0,0,0), V2 = c(0,1,1,1,0), V3 = c(0,0,0,1,1), V4 = c(0,1,1,1,1))
setDT(df)
df[ , lapply(.SD, sum), by = MonthYear]
# MonthYear V1 V2 V3 V4
#1: JAN15 2 1 0 1
#2: FEB15 0 1 0 1
#3: MAR15 0 1 2 2
如果您的示例数据不能很好地解决您的问题并且您真的想要SQL count(var)
,那么只需使用df[, lapply(.SD, function(x) sum(!is.na(x))), by = MonthYear]
,这将按组计算非NA元素。