Programing

dplyr의 문자열 열에서 여러 값 필터링

crosscheck 2020. 11. 26. 07:53
반응형

dplyr의 문자열 열에서 여러 값 필터링


나는이 data.frame열 중 하나에서 문자 데이터로. data.frame동일한 열에서 여러 옵션을 필터링하고 싶습니다 . 내가 놓친 쉬운 방법이 있습니까?

예 : data.frame 이름 =dat

days      name
88        Lynn
11          Tom
2           Chris
5           Lisa
22        Kyla
1          Tom
222      Lynn
2         Lynn

나는 필터링하고 싶습니다 TomLynn예를 들면.
내가 할 때 :

target <- c("Tom", "Lynn")
filt <- filter(dat, name == target)

이 오류가 발생합니다.

longer object length is not a multiple of shorter object length

%in%대신 다음이 필요 합니다 ==.

library(dplyr)
target <- c("Tom", "Lynn")
filter(dat, name %in% target)  # equivalently, dat %>% filter(name %in% target)

생산

  days name
1   88 Lynn
2   11  Tom
3    1  Tom
4  222 Lynn
5    2 Lynn

이유를 이해하려면 여기에서 어떤 일이 발생하는지 고려하십시오.

dat$name == target
# [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE

기본적으로 2 개의 길이 target벡터를 4 번 재활용하여 dat$name. 즉, 우리는 다음을 수행하고 있습니다.

 Lynn == Tom
  Tom == Lynn
Chris == Tom
 Lisa == Lynn
 ... continue repeating Tom and Lynn until end of data frame

이 경우 데이터 프레임에 재활용을 허용하지 않는 행 수가 실제로 다른 것으로 의심되기 때문에 오류가 발생하지 않지만 제공 한 샘플은 수행합니다 (8 행). 샘플에 홀수의 행이 있었다면 나는 당신과 같은 오류를 얻었을 것입니다. 그러나 재활용이 작동하더라도 이것은 분명히 원하는 것이 아닙니다. 기본적으로이 진술 dat$name == target은 다음과 같이 말하는 것과 같습니다.

TRUE"Tom"과 같은 모든 홀수 값 또는 "Lynn"과 같은 모든 짝수 값에 대해 반환 합니다.

따라서 샘플 데이터 프레임의 마지막 값이 짝수이고 "Lynn"과 같으므로 TRUE위 값이됩니다.

대조적으로 다음과 dat$name %in% target같이 말합니다.

의 각 값에 대해에 dat$name존재하는지 확인하십시오 target.

아주 다릅니다. 결과는 다음과 같습니다.

[1]  TRUE  TRUE FALSE FALSE FALSE  TRUE  TRUE  TRUE

귀하의 문제는 dplyr.NET의 오용 과 관련이 없습니다 ==.


base패키지 사용 :

df <- data.frame(days = c(88, 11, 2, 5, 22, 1, 222, 2), name = c("Lynn", "Tom", "Chris", "Lisa", "Kyla", "Tom", "Lynn", "Lynn"))

# Three lines
target <- c("Tom", "Lynn")
index <- df$name %in% target
df[index, ]

# One line
df[df$name %in% c("Tom", "Lynn"), ] 

산출:

  days name
1   88 Lynn
2   11  Tom
6    1  Tom
7  222 Lynn
8    2 Lynn

사용 sqldf:

library(sqldf)
# Two alternatives:
sqldf('SELECT *
      FROM df 
      WHERE name = "Tom" OR name = "Lynn"')
sqldf('SELECT *
      FROM df 
      WHERE name IN ("Tom", "Lynn")')

이는 CRAN에서 사용할 수있는 dplyr 패키지를 사용하여 수행 할 수 있습니다. 이를 달성하는 간단한 방법 :

  1. dplyr패키지를 설치하십시오 .

  2. library(dplyr) df<- select(filter(dat,name=='tom'| name=='Lynn',c('days','name))

설명:

따라서 dplyr을 다운로드하면이 패키지의 두 가지 다른 기능을 사용하여 새 데이터 프레임을 만듭니다.

filter: the first argument is the data frame; the second argument is the condition by which we want it subsetted. The result is the entire data frame with only the rows we wanted. select: the first argument is the data frame; the second argument is the names of the columns we want selected from it. We don’t have to use the names() function, and we don’t even have to use quotation marks. We simply list the column names as objects.

참고URL : https://stackoverflow.com/questions/25647470/filter-multiple-values-on-a-string-column-in-dplyr

반응형