sum()或其他方法来计算数据帧子集中的TRUE

时间:2019-04-29 06:09:54

标签: r dataframe sum logical-operators

我有一个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,但满足增加区域的需求?

2 个答案:

答案 0 :(得分:1)

除了杰伊提出的手动取消列表并转换为var settings = new XmlWriterSettings() { IndentChars = "\r\n" } 之外,我们还可以使用一些专门设计用于matrix的R函数,例如data.framesrowSums()。这些函数在colSums()的每一行/列上工作,因此将其自变量隐式转换为向量,并为其定义了和。对每一行/每一列完成此操作后,我们可以对结果求和以获得总和。

data.frame

答案 1 :(得分:0)

sum仅在具有所有数字变量的数据框中定义。如果我们查看这些模式,就会发现sumdata.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))