[英]R - filtering rows and summing
我有一个多列的data.table
。 我试图对一个特定列的子集求和。
sum(basetable_orig[get(var) %in% values[s], .(get(target))])
但是,这会导致错误:
FUN(X [[i]],...)中的错误:仅在具有所有数字变量的数据帧上定义
因此,我调查了一下,这是到目前为止的发现:
var <- "colName"
target <- "target"
s <- 1
values <- c("1","2")
感兴趣的列是数字类型:
str(basetable_orig[,c("colName")])
#gives following:
Classes ‘data.table’ and 'data.frame': 12345 obs. of 1 variable:
$ colName: num 1 1 1 1 2 1 1 1 1 1 ...
没什么,我看到data.table
自动将数字变量转换为因数:
tst <- basetable_orig[get(var) %in% values[s], .(get(target))]
str(tst)
#gives following:
Classes ‘data.table’ and 'data.frame': 12345 obs. of 1 variable:
$ V1: Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
因此,它显然不能做总和。 因此,任何人都可以向我解释为什么会这样以及如何解决?
编辑
以下是可重现的示例。
var <- "colName"
target <- "colTarget"
s <- 1
example_data <- data.table(colName = c(1,2,1,2,1), colTarget = c("0","0","1","1","1"))
example_data <- example_data[, colTarget:=as.factor(colTarget)]
str(example_data)
#Classes ‘data.table’ and 'data.frame': 5 obs. of 2 variables:
# $ colName : num 1 2 1 2 1
#$ colTarget: Factor w/ 2 levels "0","1": 1 1 2 2 2
values<-names(table(example_data[,get(var)],exclude = NULL))
print(values)
#[1] "1" "2"
tst <- example_data[get(var) %in% values[s], .(get(target))]
str(tst)
#Classes ‘data.table’ and 'data.frame': 1 obs. of 1 variable:
#$ V1: Factor w/ 2 levels "0","1": 1 2 2
sum(example_data[get(var) %in% values[s], .(get(target))])
#Gives an error:
#Error in FUN(X[[i]], ...) :
# only defined on a data frame with all numeric variables
预期的输出如下。 这是我拥有的表,我想为colName = 1计算colTarget中的“ 1”数。 因此,结果应为2(colTarget列的1,3,5行的总和)
colName colTarget
1: 1 0
2: 2 0
3: 1 1
4: 2 1
5: 1 1
干得好:
library(data.table)
example_data[colName == 1 & colTarget == 1, sum(colName)]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.