2014-08-28 3 views
2

저는 R을 처음 접했고 데이터를 신속하게 조작하고 읽을 수있는 정보를 반환하는 데 힘을 쏟았습니다. 당분간은, 나는 붙어있다.데이터 프레임의 여러 열을 검색합니다.

데이터 프레임으로 가져온 데이터 세트가 많습니다. 정규식 (grepl?)을 사용하여 데이터 프레임의 특정 열을 검색하고 검색 결과를 새 열에 배치하고 싶습니다. apply 또는 ddply으로이 작업을 수행 할 수 있다고 생각했지만이 작업을 수행 할 수있을 정도로 기능이 마음에 들지는 않았습니다. search <- apply(df, 2, function(x){grepl("d", x, perl=TRUE)}) (무엇보다도), 반환 : 여기

반환
df <- structure(list(w = structure(c(3L, 2L, 1L, 3L, 3L), .Label = c("b", 
"c", "d"), class = "factor"), x = structure(c(1L, 2L, 1L, 2L, 
3L), .Label = c("a", "b", "d"), class = "factor"), y = structure(c(2L, 
1L, 1L, 1L, 1L), .Label = c("a", "d"), class = "factor")), .Names = c("w", 
"x", "y"), row.names = c(NA, -5L), class = "data.frame") 

...

w x y 
1 d a d 
2 c b a 
3 b a a 
4 d b a 
5 d d a 

내가 해봤 ... 샘플 데이터 프레임의

  w  x  y 
[1,] TRUE FALSE TRUE 
[2,] FALSE FALSE FALSE 
[3,] FALSE FALSE FALSE 
[4,] TRUE FALSE FALSE 
[5,] TRUE TRUE FALSE 

내가 결과로 갖고 싶은 것은 ...

w x y z 
1 d a d TRUE 
2 c b a FALSE 
3 b a a FALSE 
4 d b a TRUE 
5 d d a TRUE 

나는 이것이 진보 된 당신들에게는 매우 사소한 것처럼 보인다고 알고 있습니다. 내가 배울 수 있도록 시간을내어 미리 감사드립니다. 또한이 특정 문제에 대한 답변을 찾는 동안 학습/읽어야 할 사항에 대한 제안을 듣고 싶습니다. 이러한 유형의 데이터 조작에 대한 더 나은 이해를 얻을 수 있습니다.

답변

4

정규 표현식이 필요하지 않습니다. rowSums을 사용할 수 있습니다.

df == "d"을 사용하면 전체 데이터 프레임이 논리 값으로 변환됩니다. FALSE은 숫자가 0이므로 0보다 큰 모든 행 합계는 행에 적어도 하나의 "d"이 있음을 의미합니다.

> df$z <- rowSums(df == "d") > 0 
> df 
# w x y  z 
# 1 d a d TRUE 
# 2 c b a FALSE 
# 3 b a a FALSE 
# 4 d b a TRUE 
# 5 d d a TRUE 

여러 값에 대해이 작업을 수행해야하는 경우 함수를 작성할 수 있습니다.

fun <- function(data, what) { 
    data$z <- rowSums(data == what) > 0 
    data 
} 
fun(df, "b") 
fun(df, "d") 
lapply(c("a", "b"), fun, data = df) 

또 다른 방법은 행에 걸쳐 apply을 사용하는 것입니다. any는 첫 번째 인자 중 하나가 참조 자료와 관련하여 TRUE

df$z <- apply(df == "d", 1, any) 

경우 TRUE을 반환하는 함수, 난 R을 배울 수있는 가장 좋은 장소가 http://cran.r-project.org/doc/manuals/에서 R.이 설명서를 확인 쓴 사람들이라고 생각

3

도 사용할 수 있습니다 다음은

df$result = apply(df, 1, function(x) any(grepl("d",x))) 
df 
    w x y result 
1 d a d TRUE 
2 c b a FALSE 
3 b a a FALSE 
4 d b a TRUE 
5 d d a TRUE 
관련 문제