2010-01-23 3 views
10

두 번째 열인 약 40 열의 데이터 프레임이 있는데 data [2]는 나머지 행 데이터가 설명하는 회사의 이름을 포함합니다. 그러나 회사의 이름은 연도에 따라 다릅니다 (2009 년 데이터의 후행 09, 2010 년의 경우 없음).문자열에서 OR 조건을 사용하여 R로 서브 세트 지정

저는 몇 년 동안 한 번에 데이터를 가져올 수 있도록 데이터의 하위 집합을 만들 수 있기를 바랍니다. 다음은 내가하려고하는 것의 예입니다.

subset(data, data[2] == "Company Name 09" | "Company Name", drop = T) 

본질적으로 하위 집합 함수 내에서 OR 연산자를 사용하는 데 어려움이 있습니다.

그러나, 나는 시도 다른 대안 :

subset(data, data[[2]] == grep("Company Name", data[[2]])) 

아마도 문자열 함수를 사용하여 할 수있는 쉬운 방법이?

어떤 생각이든 적용됩니다.

+3

하위 집합 (데이터, 데이터 [, 2] == "회사 이름 09"| 데이터 [, 2] == "회사 이름", drop = T) –

+0

구문, 최악의 적. 고마워. 조나단. 그게 내가하려는 일 이었어. –

답변

14

먼저 두 번째 열을 참조하기 위해 조나단이 작성한 것처럼 (data[[2]] 또는 data[,2]) 사용해야합니다. 그러나 하위 집합을 사용하는 경우 열 이름 : subset(data, CompanyName == ...)을 사용할 수 있습니다. 당신은 내가 중 하나를 수행합니다 질문에 대한

: 그리고 두 번째에서

subset(data, data[[2]] %in% c("Company Name 09", "Company Name"), drop = TRUE) 
subset(data, grepl("^Company Name", data[[2]]), drop = TRUE) 

내가 grepl을 사용하여 경기를 TRUE와 논리적 인 벡터를 반환 (R 버전 2.9에서 도입).

+0

감사합니다. Marek, 두 번째 솔루션은 훨씬 깔끔하고 코드를 단순화합니다. 내가 문자열을 검색 할 때 grepl이 내 문서에 없습니다. –

+0

감사합니다. 많은 Marek, 서브 세트가'% in % '을 (를) 허용한다는 것을 알지 못했습니다. 이렇게하면 OR 절과 함께 많은 성가신/오류가 발생하기 쉬운 입력을 절약 할 수 있습니다. +1 !! 지금까지의 나의 대답. –

+1

열 이름에 공백이 있으면 어떻게됩니까? 예 : "회사 이름". 우리는 여전히 하위 집합을 사용할 수 있습니까 – RockScience

5

몇 가지 :

1) 모의 된 데이터는 우리가 당신이 직면하고 정확히 알고하지 않기 때문에 유용합니다. 가능한 경우 데이터를 제공하십시오. 어쩌면 나는 다음과 같이 오해 했을까? 색인 data.frame에 [[2]]를 사용하지 마십시오

2), 나는 [이 "COLNAME은"] 다음, 유일한 차이점은 이름 뒤에 '09'인 경우)

3 훨씬 명확 생각 단순히 정규 표현식이 아웃 :

지금
R> x1 <- c("foo 09", "bar", "bar 09", "foo") 
R> x2 <- gsub(" 09$", "", x1) 
[1] "foo" "bar" "bar" "foo" 
R> 

당신이 즉석에서 변환 된 데이터에 일부를 수행 할 수 있어야한다 :

R> data <- data.frame(value=1:4, name=x1) 
R> subset(data, gsub(" 09$", "", name)=="foo") 
    value name 
1  1 foo 09 
4  4 foo 
R> 

또한 regexp'ed로 이름 열을 대체 할 수 VA lue.

+0

Jonathan이 위의 의견에서 내가 찾던 답변을 나에게주었습니다. 그러나 당신의 포스트는 내가 가지고 있었던 또 다른 비슷한 문제를 해결합니다. 덕분에 더크. –

+0

내 기쁨 - 도움이 되니 기쁩니다. –

관련 문제