2016-06-29 5 views
1

다음은 샘플 데이터 프레임입니다.R 데이터 프레임의 모든 열에서 값 검색

df = data.frame(company = c('a', 'b', 'c', 'd'), 
       bond = c(0.2, 1, 0.3, 0), 
       equity = c(0.7, 0, 0.5, 1), 
       cash = c(0.1, 0, 0.2, 0)) 
df 

    company bond equity cash 
1  a 0.2 0.7 0.1 
2  b 1.0 0.0 0.0 
3  c 0.3 0.5 0.2 
4  d 0.0 1.0 0.0 

모든 열에 1.0이있는 회사를 찾아야합니다. 예상 결과는 b 및 d이어야합니다.

> 20 열 이상 사용할 수있는 솔루션을 제공해주십시오. df %>% filter(bond == 1)과 같은 솔루션은 특정 열을 검색하는 경우에만 작동합니다.

dplyr 또는 data.table 해결책이 허용됩니다.

감사합니다.

+0

가 확인으로 Reduce을 사용할 수 있습니다 평등 수레는 오류가 발생하기 쉬운 사업입니다. 'x = (.1 + .2) * (10/3)'을보고 나서'x == 1'을 테스트 해보십시오 ... – Frank

+0

Fwiw, 여기에 몇 가지 변형이 있습니다 : http://stackoverflow.com/q/28233561/및 http://stackoverflow.com/q/25692392/ – Frank

답변

4

사용 rowSums 작동합니다 논리 데이터 프레임을 확인 :

df[rowSums(df[-1] == 1.0) != 0, 'company'] 
[1] b d 
Levels: a b c d 
+0

Btw, 그냥 ... 비 숫자 열을 검색하는 방법을 공유 할 수 있습니까? – shawnl

+0

필터 조건이 각 열마다 다르다는 것을 의미합니까? 나는이 방법이 그 경우에 효과가 있다고 생각하지 않는다. 어쨌든 당신은 기둥과 조건이 무엇인지에 대해 더 구체적으로 알아볼 필요가 있습니다. – Psidom

1
var <- df %>% select(bond:cash) %>% names 
plyr::ldply(var, function(x) paste("filter(df,", x, "==1)") %>% parse(text=.) %>% eval) 
    company bond equity cash 
1  b 1  0 0 
2  d 0  1 0 
4

또 다른 옵션 :

df[unique(row(df[-1])[df[-1] == 1L]),] 
# company bond equity cash 
#2  b 1  0 0 
#4  d 0  1 0 

df$company[unique(row(df[-1])[df[-1] == 1L])] 
#[1] b d 
#Levels: a b c d 
+0

이 방법도 사용할 수 있습니까? 'Df [row (df) [df == 1]]] –

+1

@PierreLafortune -이 경우에는, 그렇지만, 여러 열에 1이 있으면 고유해야한다고 생각합니다. – thelatemail

4

우리는 또한 ==

res <- df[Reduce(`+`, lapply(df[-1], `==`, 1))!=0,] 
res 
# company bond equity cash 
#2  b 1  0 0 
#4  d 0  1 0 

res$company 
#[1] b d 
#Levels: a b c d 
+2

나는 akrun 방법이'df [!! rowSums (df == 1),]'이라고 생각한다. : –

+0

@PierreLafortune 네, 맞습니다. 누군가 이미'rowSums'를 사용하여 해결책을 게시 했으므로 표절에 대한 투쟁에 빠지다 :-) – akrun

+1

그들은'x! = 0' 부분에 모든 잘못이있다. –

관련 문제