programing

논리 벡터에서 TRUE 값을 카운트하는 방법

abcjava 2023. 7. 5. 20:01
반응형

논리 벡터에서 TRUE 값을 카운트하는 방법

R에서, 다음의 수를 셀 수 있는 가장 효율적인 방법은 무엇입니까?TRUE논리 벡터의 값?저는 두 가지 방법을 생각할 수 있습니다.

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

table(z)["TRUE"]
# TRUE 
#  498 

어느 것이 좋습니까?더 좋은 것이 있습니까?

가장 안전한 방법은 사용하는 것입니다.sum와 함께na.rm = TRUE:

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

이 값은 1입니다.

논리 벡터에 다음이 포함될 경우 다른 솔루션에 몇 가지 문제가 있습니다.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)

로 한또.table효율성이 (「 」 「 」 「 」 「 」 「 」의를 참조하십시오.table함수)를 선택합니다.

또한 논리 벡터에 TRUE 값이 없을 경우를 대비하여 "테이블" 솔루션에 주의해야 합니다.예를 참조하십시오.

z <- c(FALSE, FALSE)
table(z)["TRUE"] # gives you `NA`

또는

z <- c(NA, FALSE)
table(z)["TRUE"] # gives you `NA`

언급되지 않은 또 다른 옵션은 사용하는 것입니다.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마렉이 제안한 가치들.

값에 사항을 하려고 합니다.which함수:

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

는 논리적인 는적인확 다합니인것만논만 에 유의하십시오.TRUE따라서 기본적으로 비논리적인 값을 무시합니다.

또 다른 방법은

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

하는 동안에sum(z)나에게는 멋지고 짧습니다.length(z[z==TRUE])좀 더 자기 자신을 설명하는 것입니다.하지만 이런 간단한 작업으로는 별 차이가 없다고 생각합니다.

만약 그것이 큰 벡터라면, 당신은 아마도 가장 빠른 해결책을 사용해야 할 것입니다.sum(z).length(z[z==TRUE]) 10배 느립니다.table(z)[TRUE]는 보배약 200느다보다 약 느립니다.sum(z).

요하면약.sum(z)가장 빠르게 입력하고 실행할 수 있습니다.

다른 옵션은 요약 기능을 사용하는 것입니다.Ts, Fs 및 NA에 대한 요약을 제공합니다.

> summary(hival)
   Mode   FALSE    TRUE    NA's 
logical    4367      53    2076 
> 

which특히 행렬에 대해 작업할 때 좋은 대안입니다(확인).?which 그고주목요세하리▁the요▁notice▁and에 주목하세요.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결과적으로, 하지만 만약 당신이 합격한다면.na.rm = TRUEsum기능, 당신은 당신이 원하는 결과를 얻을 것입니다.

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

당신의 질문은 순전히 이론적인 것입니까, 아니면 논리 벡터와 관련된 실제적인 문제가 있습니까?

다음과 같은 패키지도 있습니다.bit빠른 부울 연산을 위해 특별히 설계되었습니다.벡터가 크거나 부울 연산을 많이 수행해야 하는 경우 특히 유용합니다.

z <- sample(c(TRUE, FALSE), 1e8, rep = TRUE)

system.time({
  sum(z) # 0.170s
})

system.time({
  bit::sum.bit(z) # 0.021s, ~10x improvement in speed
})

저는 몇 주 전에 비슷한 일을 하고 있었습니다.여기 가능한 해결책이 있습니다. 처음부터 작성되었기 때문에 일종의 베타 릴리스 같은 것입니다.코드에서 루프를 제거하여 개선하도록 하겠습니다.

주요 아이디어는 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 인수를 전달하면 수정된 data.frame을 반환합니다.내가 이걸 고치도록 노력할게요...도움이 되길 바랍니다!

논리적 벡터에서 실제 문장의 수를 세야 하는 문제가 있었습니다. 그리고 이것은 저에게 가장 효과적이었습니다.

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

이것은 gene.rep.matrix 개체의 일부를 취하여 논리적 테스트를 적용하여 논리적 벡터를 반환합니다.이 벡터는 TRUE 항목의 위치를 반환하는 grep 인수로 지정됩니다.그런 다음 길이는 grep가 찾은 항목 수를 계산하여 TRUE 항목 수를 제공합니다.

언급URL : https://stackoverflow.com/questions/2190756/how-to-count-true-values-in-a-logical-vector

반응형