3

다른 열의 여러 조건을 기반으로 데이터 프레임에 새 열을 추가하려고합니다. 다음과 같은 세 가지 조건이 충족되는 경우여러 열의 여러 조건을 기반으로 새 열을 만드는 방법은 무엇입니까?

> commute <- c("walk", "bike", "subway", "drive", "ferry", "walk", "bike", "subway", "drive", "ferry", "walk", "bike", "subway", "drive", "ferry") 
> kids <- c("Yes", "Yes", "No", "No", "Yes", "Yes", "No", "No", "Yes", "Yes", "No", "No", "Yes", "No", "Yes") 
> distance <- c(1, 12, 5, 25, 7, 2, "", 8, 19, 7, "", 4, 16, 12, 7) 
> 
> df = data.frame(commute, kids, distance) 
> df 
    commute kids distance 
1  walk Yes  1 
2  bike Yes  12 
3 subway No  5 
4 drive No  25 
5 ferry Yes  7 
6  walk Yes  2 
7  bike No   
8 subway No  8 
9 drive Yes  19 
10 ferry Yes  7 
11 walk No   
12 bike No  4 
13 subway Yes  16 
14 drive No  12 
15 ferry Yes  7 

:

commute = walk OR bike OR subway OR ferry 
AND 
kids = Yes 
AND 
distance is less than 10 

가 그럼 난 "예"를 동일하게 get.flyer라는 새로운 컬럼을하고 싶습니다 나는 다음과 같은 데이터가 있습니다. 최종 데이터 프레임은 다음과 같아야합니다 : 우리는 두 조건에 해당하는 경우 확인하기 위해 열 &에서 여러 요소를 비교 %in%을 사용할 수 있습니다

commute kids distance get.flyer 
1  walk Yes  1  Yes 
2  bike Yes  12  Yes 
3 subway No  5   
4 drive No  25   
5 ferry Yes  7  Yes 
6  walk Yes  2  Yes 
7  bike No     
8 subway No  8   
9 drive Yes  19   
10 ferry Yes  7  Yes 
11 walk No     
12 bike No  4   
13 subway Yes  16  Yes 
14 drive No  12   
15 ferry Yes  7  Yes 
+0

것은 따라 해보세요 통근에 대한 factor을 사용할 수 kids 변수 [이] (http://stackoverflow.com/questions/5963269/만드는 방법 - 위대한 - r을 reproducible - 예/38523589 # 38523589) – user2100721

답변

6

.

library(dplyr) 
df %>% 
    mutate(get.flyer = c("", "Yes")[(commute %in% c("walk", "bike", "subway", "ferry") & 
      as.character(kids) == "Yes" & 
      as.numeric(as.character(distance)) < 10)+1]) 

TRUE이다 기본적으로 stringsAsFactors=FALSEdata.frame를 작성하는 것이 좋습니다 . str(df)을 확인하면 모든 열이 factor 클래스임을 알 수 있습니다. 또한 누락 된 값이있는 경우 "" 대신 NA을 사용하여 numeric 열의 class이 다른 것으로 변환되지 않도록 할 수 있습니다.

우리는 위의 코드가 더 나은 이해를 위해

df1 %>% 
    mutate(get.flyer = c("", "Yes")[(commute %in% c("walk", "bike", "subway", "ferry") & 
     kids == "Yes" & 
     distance < 10)+1]) 

을 단순화 할 수

distance <- c(1, 12, 5, 25, 7, 2, NA, 8, 19, 7, NA, 4, 16, 12, 7) 
df1 <- data.frame(commute, kids, distance, stringsAsFactors=FALSE) 

'안양'의 생성을 다시 작성하는 경우, 어떤 사람들은 ifelse

df1 %>% 
    mutate(get.flyer = ifelse(commute %in% c("walk", "bike", "subway", "ferry") & 
       kids == "Yes" & 
       distance < 10, 
          "Yes", "")) 

이 수를 선호 base R 방법으로도 쉽게 수행 할 수 있습니다.

df1$get.flyer <- with(df1, ifelse(commute %in% c("walk", "bike", "subway", "ferry") & 
       kids == "Yes" & 
       distance < 10, 
         "Yes", "")) 
6

솔루션은 이미 @akrun에 의해 지적되었습니다. 나는 그것을 좀 더 '포장 된'방식으로 제시하고자합니다.

ifelse 문을 사용하여 하나 이상의 조건을 기반으로 열을 만들 수 있습니다. 하지만 먼저 거리 열에서 누락 된 값의 '인코딩'을 변경해야합니다. 누락 된 값을 나타내려면 ""을 사용했지만이 값은 전체 열을 string으로 변환하고 수치 비교를 금지합니다 (distance < 10는 불가능합니다).누락 된 값을 나타내는의 R 방법은 NA입니다 distance 당신의 열 정의는 다음과 같아야합니다

distance <- c(1, 12, 5, 25, 7, 2, NA, 8, 19, 7, NA, 4, 16, 12, 7) 

ifelse 문은 다음과 같습니다

df$get.flyer <- ifelse(
    ( 
     (df$commute %in% c("walk", "bike", "subway", "ferry")) & 
     (df$kids == "Yes")          & 
     (df$distance < 10) 
    ), 
    1, # if condition is met, put 1 
    0 # else put 0 
) 

옵션 : 다른 열을 인코딩 고려 다른 방식으로도 사용할 수 있습니다.

  • TRUE 대신의 FALSE "예"와 "아니오"에 대한
관련 문제