代码之家  ›  专栏  ›  技术社区  ›  Jyotirmoy Bhattacharya

如何计算逻辑向量中的真值

r
  •  139
  • Jyotirmoy Bhattacharya  · 技术社区  · 14 年前

    在R语言中,计算 TRUE 逻辑向量中的值?我可以想出两种方法:

    z <- sample(c(TRUE, FALSE), 1000, rep = TRUE)
    sum(z)
    # [1] 498
    
    table(z)["TRUE"]
    # TRUE 
    #  498 
    

    你喜欢哪一种?还有更好的吗?

    7 回复  |  直到 14 年前
        1
  •  147
  •   Henrik plannapus    6 年前

    当逻辑向量包含 NA 价值观。
    例如,请参见:

    z <- c(TRUE, FALSE, NA)
    sum(z) # gives you NA
    table(z)["TRUE"] # gives you 1
    length(z[z == TRUE]) # f3lix answer, gives you 2 (because NA indexing returns values)
    

    所以我认为最安全的是使用 na.rm = TRUE :

    sum(z, na.rm = TRUE) # best way to count TRUE values
    

    (给出1)。我认为 table 解决方案效率较低(请看 桌子 函数)。

    另外,如果逻辑向量中没有真值,那么应该小心使用“表”解决方案。假设 z <- c(NA, FALSE, NA) 或者简单地 z <- c(FALSE, FALSE)

    table(z)["TRUE"] # gives you NA for both cases.
    
        2
  •  78
  •   Shane    14 年前

    另一个尚未提及的选项是使用 which 以下内容:

    length(which(z))
    

    仅仅为了提供一些关于“哪一个问题更快”的上下文,测试自己总是最容易的。我把向量做得更大,以便比较:

    z <- sample(c(TRUE,FALSE),1000000,rep=TRUE)
    system.time(sum(z))
       user  system elapsed 
       0.03    0.00    0.03
    system.time(length(z[z==TRUE]))
       user  system elapsed 
       0.75    0.07    0.83 
    system.time(length(which(z)))
       user  system elapsed 
       1.34    0.28    1.64 
    system.time(table(z)["TRUE"])
       user  system elapsed 
      10.62    0.52   11.19 
    

    如此清楚地使用 sum 在这种情况下是最好的方法。您可能还需要检查 NA 如Marek建议的值。

    只需添加有关na值和 哪一个 功能:

    > which(c(T, F, NA, NULL, T, F))
    [1] 1 4
    > which(!c(T, F, NA, NULL, T, F))
    [1] 2 5
    

    注意,它只检查逻辑 TRUE 因此,它基本上忽略了非逻辑值。

        3
  •  11
  •   f3lix    14 年前

    另一种方式是

    > length(z[z==TRUE])
    [1] 498
    

    同时 sum(z) 对我来说又好又矮 length(z[z==TRUE]) 更能自我解释。不过,我认为像这样的简单任务并没有真正意义…

    如果它是一个大向量,你可能应该使用最快的解,也就是 和(z) . 长度(z[z==true]) 大约慢10倍 table(z)[TRUE] 比…慢200倍 和(z) .

    总结, 总和(z) 是最快的输入和执行。

        4
  •  6
  •   aL3xa    14 年前

    which 是很好的选择,尤其是在矩阵上操作时(检查 ?which 并注意到 arr.ind 争论)。但我建议你坚持 sum 因为 na.rm 可以处理的参数 NA 的逻辑向量。 例如:

    # create dummy variable
    set.seed(100)
    x <- round(runif(100, 0, 1))
    x <- x == 1
    # create NA's
    x[seq(1, length(x), 7)] <- NA
    

    如果键入 sum(x) 你会得到 结果,但如果你通过 na.rm = TRUE 在里面 总和 函数,您将得到所需的结果。

    > sum(x)
    [1] NA
    > sum(x, na.rm=TRUE)
    [1] 43
    

    你的问题是严格的理论问题,还是关于逻辑向量的一些实际问题?

        5
  •  5
  •   ramrad    9 年前

    另一种选择是使用摘要函数。它总结了TS、FS和NAS。

    > summary(hival)
       Mode   FALSE    TRUE    NA's 
    logical    4367      53    2076 
    > 
    
        6
  •  0
  •   wds    11 年前

    几周前我也做过类似的事情。这里有一个可能的解决方案,它是从头开始写的,所以它是一种测试版或者类似的版本。我将尝试通过从代码中删除循环来改进它…

    主要思想是编写一个接受2(或3)个参数的函数。第一个是 data.frame 它保存了从问卷中收集到的数据,第二个是一个有正确答案的数字向量(这仅适用于单项选择问卷)。或者,可以添加第三个参数,该参数将返回带有最终分数的数字向量,或者添加带有嵌入分数的data.frame。

    fscore <- function(x, sol, output = 'numeric') {
        if (ncol(x) != length(sol)) {
            stop('Number of items differs from length of correct answers!')
        } else {
            inc <- matrix(ncol=ncol(x), nrow=nrow(x))
            for (i in 1:ncol(x)) {
                inc[,i] <- x[,i] == sol[i]
            }
            if (output == 'numeric') {
                res <- rowSums(inc)
            } else if (output == 'data.frame') {
                res <- data.frame(x, result = rowSums(inc))
            } else {
                stop('Type not supported!')
            }
        }
        return(res)
    }
    

    我将尝试以更优雅的方式,使用一些*层功能。注意到我没有 na.rm 争论…会那样做

    # create dummy data frame - values from 1 to 5
    set.seed(100)
    d <- as.data.frame(matrix(round(runif(200,1,5)), 10))
    # create solution vector
    sol <- round(runif(20, 1, 5))
    

    现在应用一个函数:

    > fscore(d, sol)
     [1] 6 4 2 4 4 3 3 6 2 6
    

    如果传递data.frame参数,它将返回modified data.frame。 我会设法解决这个问题…希望它有帮助!

        7
  •  0
  •   A_Skelton73    10 年前

    我刚刚遇到了一个特殊的问题,我必须从逻辑向量中计算出真实语句的数量,这对我来说最有效…

    length(grep(TRUE, (gene.rep.matrix[i,1:6] > 1))) > 5
    

    所以这需要gene.rep.matrix对象的一个子集,并应用逻辑测试,返回逻辑向量。这个向量作为grep的参数,grep返回任何真实条目的位置。然后,length计算grep找到的条目数,从而给出真实条目数。