다른 댓글과 답변도 사용할 수 있지만 data.frame
을 사용할 때 악의적 인 행동을 조장하는 것이 좋습니다. 무엇보다 먼저 apply
과 rowSums
은 matrix
을 데이터로 기대하며, data.frame
으로 주어진 경우 행복하게 강요합니다. data.frame
열이 character
인 경우 모든 열은 character
으로 변환됩니다. 일부 연산은 예상대로 작동 할 수 있습니다 (예 : == 1
). 실제로는 반올림 오류로 인해 원치 않는 결과가 발생할 수 있지만 == "1"
이 될 수 있기 때문에 수학적으로 작동하지 않습니다. 예를 들어
,
n <- 20
set.seed(2)
tab <- data.frame(
a = as.character(sample(n, replace = FALSE)),
b1 = sample(5, size = n, replace = TRUE),
b2 = sample(5, size = n, replace = TRUE),
stringsAsFactors = FALSE
)
str(tab)
# 'data.frame': 20 obs. of 3 variables:
# $ a : chr "4" "14" "11" "3" ...
# $ b1: int 4 2 5 1 2 3 1 2 5 1 ...
# $ b2: int 5 2 1 1 5 4 5 2 3 5 ...
apply(tab, 1, function(y) any(y == 1))
# [1] FALSE FALSE TRUE TRUE FALSE FALSE TRUE FALSE FALSE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE TRUE FALSE TRUE
apply(tab, 1, sum)
# Error in FUN(newX[, i], ...) : invalid 'type' (character) of argument
rowSums(tab == 1)
# [1] 0 0 1 2 0 0 1 0 0 1 2 2 0 0 0 0 0 1 0 1
rowSums(tab)
# Error in rowSums(tab) : 'x' must be numeric
이 다루는 몇 가지 쉬운 방법이 있습니다. 귀하의 예를 볼 때, 열 2:16
은 숫자이며 걱정되는 것으로 보입니다. 그런 경우에, 당신은 안전하게 사용할 수 있습니다 중 하나
rowSums(tab[,2:16] == 1) # Frank's comment
apply(tab[,2:16], 1, function(y) any(y == 1)) # suggested by You-leee's answer
(전 공정 특정되고, 후자는 다른 기능을 확장 할 수 있습니다). 하나의 비 numeric
, 있다면 한번 항상 세 번째 기술은 열을 선택할 수 런타임에 결정
rowSums(tab[,-1,drop=FALSE] == 1)
apply(tab[,-1,drop=FALSE], 1, function(y) any(y == 1))
입니다 수행 할 수 있습니다
isnum <- sapply(tab, is.numeric)
Reduce(`|`, lapply(tab[isnum], function(y) any(y == 1)))
이 좀 더 복잡 반환하기 때문에 lapply
은 list
이지만 여전히 정상적으로 작동합니다. isnum
의 사용은 grepl
과 같은 것을 사용하여 열 이름을 기반으로 할 수 있음을 알 수 있습니다. 이 방법은 열이 일치하지 않으면 오류가 발생하지 않으므로 상당히 강력합니다.
적용 제품군에 대해 읽어보십시오. R 터미널에'? apply' 또는'? lapply'라고 타이핑하고 R! – JMT2080AD
이스라엘 답장, 제공된 답 중 하나가 귀하의 질문을 해결합니까? 그렇다면 에티켓은 특정 대답의 왼쪽에있는 체크 표시를 선택하여 선호하는 대답을 "수락"할 것을 제안합니다. (그렇지 않다면 피드백을주십시오.) 감사합니다! – r2evans