2017-11-17 6 views
1

데이터 프레임의 열을 통해 실행되는 코드를 작성하고 그 중 하나에 숫자 1이 있으면 TRUE를 반환하고 열의 크기와 동일한 크기의 벡터에 값을 보냅니다. 데이터 프레임 아래에 코드 스 니펫을 단순화하는 방법이 있는지 알고 싶습니다. 여러 숫자를 반복해야하기 때문입니다.에서 코드 단순화 R

n1 <- (tab[, 2]==1| tab[, 3]==1 | tab[, 4]==1 | tab[, 5]==1 | 
    tab[, 6]==1 | tab[, 7]==1 | tab[, 8]==1 | tab[, 9]==1 | 
    tab[, 10]==1 | tab[, 11]==1 | tab[, 12]==1 | tab[, 13]==1 | 
    tab[, 14]==1 | tab[, 15]==1 | tab[, 16]==1) 
+0

적용 제품군에 대해 읽어보십시오. R 터미널에'? apply' 또는'? lapply'라고 타이핑하고 R! – JMT2080AD

+0

이스라엘 답장, 제공된 답 중 하나가 귀하의 질문을 해결합니까? 그렇다면 에티켓은 특정 대답의 왼쪽에있는 체크 표시를 선택하여 선호하는 대답을 "수락"할 것을 제안합니다. (그렇지 않다면 피드백을주십시오.) 감사합니다! – r2evans

답변

1

다른 댓글과 답변도 사용할 수 있지만 data.frame을 사용할 때 악의적 인 행동을 조장하는 것이 좋습니다. 무엇보다 먼저 applyrowSumsmatrix을 데이터로 기대하며, 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))) 

이 좀 더 복잡 반환하기 때문에 lapplylist이지만 여전히 정상적으로 작동합니다. isnum의 사용은 grepl과 같은 것을 사용하여 열 이름을 기반으로 할 수 있음을 알 수 있습니다. 이 방법은 열이 일치하지 않으면 오류가 발생하지 않으므로 상당히 강력합니다.

+1

고맙다. 그것은 나를 많이 도왔다. 이 솔루션은 가장 안전한 솔루션이라고 생각하는 데이터 프레임이기 때문에 완벽하게 작동했습니다. –

2

한 가지 가능한 솔루션은 다음이다 : 당신이 dataframe에서 == 1 개 번호를 검색 한 후 | 연산자 그 행을 감소 : 그것은 당신에게 줄 것이다 예를 들어

tab <- data.frame(a = 1:10, b = 2:11) 

apply(tab == 1, 1, function(x) { 
    Reduce("|", x) 
}) 

의 OUPUT :

[1] TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 

또는 하나 개 더 간단한 솔루션입니다 :

apply(tab, 1, function(x) { 
    any(x == 1) 
}) 
+0

또는'rowSums (tab == 1)> 0' – Frank

+0

'apply.' 또는'rowSums'를'data.frame'과 함께 사용하는 것은 실수하고 오류가 발생하기 쉽습니다; 만약 당신이 그것이 모두 숫자라는 것을 확신한다면, 그 함수가 완벽하게 작동하는 "행렬"이 될 이유가 거의 없습니다.실수로 데이터에 숫자가 아닌 숫자가있는 순간, 두 함수 모두 동작을 변경하거나 변경합니다. (이 간단한 사건에서, 단순한'=='이 반드시 깨지는 않지만 내 전제가있다.) – r2evans