2014-11-03 2 views
0

이것은 간단하지만 수행 할 수 없습니다. 그 비슷한 소리보다 다른 질문 here. 열의 조건이 이미 존재하는 경우를 사용하여 데이터 프레임 df에 df$col1, df$col2, df$col3 등의 새로운 열을 만들고 싶습니다. 즉 df$condf$val입니다.조건으로 새 열을 만드는 방법

  1. 내가 df$col2df$con<2 경우
  2. 에 COL df$val의 값을 작성하려합니다 df$col1
  3. df$con > 3 경우에 열 "발"의 값을 작성하려합니다 나는 30를 작성하려합니다 내가 어떻게해야

1 ~ 3 df$col3 경우 df$con에서 df$val의 %는? 아래는 조건을위한 "con"과 값 사용을위한 "val"이라는 두 개의 열이있는 데이터 프레임 df입니다.

dput(df) 
structure(list(con = c(-33.09524956, -36.120924, -28.7020053, 
-26.06385399, -18.45731163, -14.51817928, -20.1005132, -23.62346403, 
-24.90464018, -23.51471516), val = c(0.016808197, 1.821442227, 
4.078385886, 3.763593573, 2.617612605, 2.691796601, 1.060565469, 
0.416400183, 0.348732675, 1.185505136)), .Names = c("con", "val" 
), row.names = c(NA, 10L), class = "data.frame") 
+0

행의 열 값을 정의 무엇을 어디 조건이 사실이 아닌가? 예 : 'con'가 <= 3 일 때'col1'의 값은 무엇입니까? NA? –

+0

예제에서 모든 NA 값의 열이 두 개입니까? –

+2

@Citrus 어떤 조건을 충족시키지 않고 적어도 일부 조건을 반영하는 예제를 제공하는 것이 좋습니다. – akrun

답변

1

이렇게 할 수 있습니다. 먼저 우리는

foo <- function(x) { 
    is.na(x) <- x == FALSE 
    return(x) 
} 

이어서 NA에 FALSE 값을 변경 논리 벡터의리스트를 적용하여 일치 val 열을하는 기능을

df[paste0("col", 1:3)] <- with(df, { 
    x <- list(con > 3, con < 2, con < 3 & con > 1) 
    lapply(x, function(y) val[foo(y)]) 
}) 

df 
     con  val col1  col2 col3 
1 -33.09525 0.0168082 NA 0.0168082 NA 
2 -36.12092 1.8214422 NA 1.8214422 NA 
3 -28.70201 4.0783859 NA 4.0783859 NA 
4 -26.06385 3.7635936 NA 3.7635936 NA 
5 -18.45731 2.6176126 NA 2.6176126 NA 
6 -14.51818 2.6917966 NA 2.6917966 NA 
7 -20.10051 1.0605655 NA 1.0605655 NA 
8 -23.62346 0.4164002 NA 0.4164002 NA 
9 -24.90464 0.3487327 NA 0.3487327 NA 
10 -23.51472 1.1855051 NA 1.1855051 NA 
+0

foo가 작동하는 방식이 확실하지 않습니다 (저는 R에 비교적 익숙합니다). 그러나 대답은 훌륭합니다 (upvote). – Marichyasana

+0

@Marichyasana - 논리 벡터를 취하고 'FALSE'인 요소는 'NA'로 변경됩니다. –

0

에 결과 값 쓰기 깔끔한 방식으로 갈 수 있습니다. 파이프 %>% 그냥 각 작업의 출력을 다음 함수로 보냅니다. mutate을 사용하면 데이터 프레임에 새로운 열을 만들 수 있지만 맨 위에 저장해야합니다. 그것은 output으로 저장됩니다. ifelse을 사용하면 새 열에 조건부로 값을 할당 할 수 있습니다 (예 : col1 열). ifelse의 두 번째 인수는 true 조건의 출력이고, 세 번째 인수는 ifelse이 거짓 일 때입니다. 희망이 너무 도움이!

tidyverse로 이동하십시오. 여기

structure(list(con = c(-33.09524956, 2.5, -28.7020053, 2, -18.45731163, 
2, -20.1005132, 6, -24.90464018, -23.51471516), val = c(0.016808197, 
1.821442227, 4.078385886, 3.763593573, 2.617612605, 2.691796601, 
1.060565469, 0.416400183, 0.348732675, 1.185505136)), .Names = c("con", 
"val"), row.names = c(NA, 10L), class = "data.frame") 

코드를 실행 한 후 output있어 : 여기

library(tidyverse) 

output <- df %>% 
    mutate(col1=ifelse(con>3, val, NA)) %>% 
    mutate(col2=ifelse(con<2, val, NA)) %>% 
    mutate(col3=ifelse(con<=3 & con>=1, 0.3*val, NA)) 

실제로 일부 조건을 충족하는 df

  con  val  col1  col2  col3 
1 -33.09525 0.0168082  NA 0.0168082  NA 
2 2.50000 1.8214422  NA  NA 0.5464327 
3 -28.70201 4.0783859  NA 4.0783859  NA 
4 2.00000 3.7635936  NA  NA 1.1290781 
5 -18.45731 2.6176126  NA 2.6176126  NA 
6 2.00000 2.6917966  NA  NA 0.8075390 
7 -20.10051 1.0605655  NA 1.0605655  NA 
8 6.00000 0.4164002 0.4164002  NA  NA 
9 -24.90464 0.3487327  NA 0.3487327  NA 
10 -23.51472 1.1855051  NA 1.1855051  NA