2017-11-09 11 views
1

누락 된 값이있는 데이터 프레임은 일부 열 (사람이 없음)입니다. 예를 들어 :"tidyr like"다른 열의 fill na

df <- data.frame(x = c(2,NA,4), y = 5:7) 
df 
    x y 
1 2 5 
2 NA 6 
3 4 7 

내가 다른 컬럼의 값이 누락 된 값을 대체하고 싶습니다. 물론 예를 들어, 이렇게 많은 방법이 있습니다 :

df %>% 
    mutate(x = ifelse(is.na(x), y, x)) 

    x y 
1 2 5 
2 6 6 
3 4 7 

을 그러나, 나는

df %>% fill(x,y) 

처럼, 더 우아한 뭔가를 찾고 있지만, 아무것도 찾을 수 없습니다. 이 같은 것이 존재합니까?

감사합니다.

+1

ifelse 대신에 dplyr의'coalesce' 함수, 즉'df %> % mutate (x = coalesce (x, as))를 사용할 수 있습니다. .numeric (y)))' –

+1

순수한'tidyr' 솔루션이 있다면, 여기에 나타 났을 것입니다 : [R에서 효율적으로 구현하는 방법] (https://stackoverflow.com/questions/19253820/how -에 -implement-coalesce-efficient-in-r) – Henrik

+0

제안 해 주셔서 감사합니다. –

답변

3

당신은 하나의 열에서 값을 변경하려면이, 행운을 시도 행. 이 작업을 수행하는 tidyverse 방법은 dplyr::mutate이며, docendo discimus가 제안 당신이 원하는 특정 작업의 tidyverse 구현은, dplyr::coalesce입니다 : 하나의 함수가 있다면

df %>% mutate(x = coalesce(x, y)) 

상황이 적은 깔끔한 덜 일관 것 이 두 단계를 결합한 것은 전체 데이터 프레임이 작동되는 것이 아니라 하나의 열에 불과하기 때문입니다. coalesce은 데이터 프레임에 있는지 여부에 관계없이 벡터에 사용할 수 있으므로 유연성이 떨어집니다. 나는 그것이 데이터 프레임의 모든 열에서 작동하기 때문에 일관성이 생각,하지만 난 그게 하나의 벡터를했다 일반적으로 mutate 내에서 사용되는 것을 선호 mutate_all(fill)가 쉬울 것이다 -


(사실 tidyr::fill 싫어한다.

+0

@ 그레고 (Gregor), 고맙습니다. '합병'에 익숙하지 않았고 실제로 내 필요성을 해결했습니다. –

3

나는 완전히 질문에 대답하지 알고,하지만 난 표준 데이터 프레임 그렇게 나쁘지 않은 방법으로 찾을 수 : 매우 간단하고 우아한

df$x[is.na(df$x)] <- df$y[is.na(df$x)] 

과 data.table 방법 :

df[is.na(x),x := y] 
+0

덕분에 @ denis, 나는 data.table 방법이 간단하고 우아하지만 genral에 나는 더 깔끔한 사용자라고 동의한다. –

0

는 같은 수를 유지

df <- t(apply(df, 1, function(x) if(any(is.na(x))) rep(x[!is.na(x)], 2) else x)) 
as.data.frame(df) 
+0

이것은 행렬로 변환되어 데이터 프레임에 존재하는'class' 차이를 없앨 것이다. – Gregor