我有一个5000 x 8000的数据框,大部分都是逻辑值。我想在各个矩形部分计算TRUE值。完美的解决方案如下所示:
features.total <- sum(df[ , 651:8500])
A,那是行不通的。以下是一些可玩的示例:
aa <- bb <- cc <- dd <- rep.int(FALSE,4)
df1 <- data.frame(aa, bb, cc, dd, stringsAsFactors = FALSE)
df1[2:3,2:3] <- TRUE
ww <- xx <- yy <- zz <- rep.int(0,4)
df2 <- data.frame(ww, xx, yy, zz, stringsAsFactors = FALSE)
df2[2:3,2:3] <- 1
v0 <- c(FALSE, TRUE, TRUE, TRUE)
v1 <- as.vector(df1[2, ])
v2 <- c(0, 1, 1, 0)
sum()与您期望的效果很好,但与其他效果不符:
FUN(X [[i]],...)中的错误:仅在具有所有 数字变量
sum(v0)
正常sum(v1)
失败sum(v2)
工作正常sum(df1)
失败sum(df2)
工作正常逻辑对象更小,更简单。是否有其他方法可以让我坚持TRUE和FALSE,但满足增加区域的需求?
答案 0 :(得分:1)
除了杰伊提出的手动取消列表并转换为var settings = new XmlWriterSettings()
{
IndentChars = "\r\n"
}
之外,我们还可以使用一些专门设计用于matrix
的R函数,例如data.frames
和rowSums()
。这些函数在colSums()
的每一行/列上工作,因此将其自变量隐式转换为向量,并为其定义了和。对每一行/每一列完成此操作后,我们可以对结果求和以获得总和。
data.frame
答案 1 :(得分:0)
sum
仅在具有所有数字变量的数据框中定义。如果我们查看这些模式,就会发现sum
在data.frame
处失败,即列出的逻辑对象($
)。
str(v0) # works fine
# logi [1:4] FALSE TRUE TRUE TRUE
# compare:
str(as.data.frame(v0))
# 'data.frame': 4 obs. of 1 variable:
# $ v0: logi FALSE TRUE TRUE TRUE
str(v1) # fails
# 'data.frame': 1 obs. of 4 variables:
# $ aa: logi FALSE
# $ bb: logi TRUE
# $ cc: logi TRUE
# $ dd: logi FALSE
str(v2) # works fine
# num [1:4] 0 1 1 0
str(df1) # fails
# 'data.frame': 4 obs. of 4 variables:
# $ aa: logi FALSE FALSE FALSE FALSE
# $ bb: logi FALSE TRUE TRUE FALSE
# $ cc: logi FALSE TRUE TRUE FALSE
# $ dd: logi FALSE FALSE FALSE FALSE
str(df2) # works fine
# 'data.frame': 4 obs. of 4 variables:
# $ ww: num 0 0 0 0
# $ xx: num 0 1 1 0
# $ yy: num 0 1 1 0
# $ zz: num 0 0 0 0
当我们unlist
他们时,它工作正常。
str(v1) # fails
sum(unlist(v1)) # works fine
# [1] 2
str(df1) # fails
sum(unlist(df1)) # works fine
# [1] 4
我们也可以将unlist
之前的data.frame
as.matrix
转换为sum
,而不必使用列表结构。
sum(as.matrix(v1))
# [1] 2
sum(as.matrix(df1))
# [1] 4
或更短...
sum(t(t(v1)))
# [1] 2
sum(t(t(df1)))
# [1] 4
...
sum(!(v1))
# [1] 2
sum(!!(df1))
# [1] 4
要在data.frame
这样的应用上
df1
# a b l1 l2 l3
# 1 t z TRUE TRUE TRUE
# 2 b a FALSE TRUE TRUE
# 3 h j FALSE TRUE FALSE
# 4 c x TRUE TRUE TRUE
str(df1)
# 'data.frame': 4 obs. of 5 variables:
# $ a : Factor w/ 4 levels "b","d","e","x": 3 2 1 4
# $ b : Factor w/ 4 levels "c","r","w","x": 2 1 4 3
# $ l1: logi FALSE FALSE TRUE TRUE
# $ l2: logi TRUE TRUE TRUE TRUE
# $ l3: logi FALSE TRUE FALSE TRUE
我们可以sum
像这样的矩形
sum(!!df1[3:5])
sum(!!df1[sapply(df1, is.logical)]) # or, allocating logical columns automatically
# [1] 8
sum(!!df1[3:4, 4:5]) # or, sub-rectangles
# [1] 3
数据
df1 <- structure(list(a = structure(c(3L, 2L, 1L, 4L), .Label = c("b",
"d", "e", "x"), class = "factor"), b = structure(c(2L, 1L, 4L,
3L), .Label = c("c", "r", "w", "x"), class = "factor"), l1 = c(FALSE,
FALSE, TRUE, TRUE), l2 = c(TRUE, TRUE, TRUE, TRUE), l3 = c(FALSE,
TRUE, FALSE, TRUE)), class = "data.frame", row.names = c(NA,
-4L))