2017-08-21 34 views
4

我有一個包含多個列的數據框,並且如果它們位於具有相同編號的兩行之間,我想在一列中替換NAs。這裏是我的數據:替換特定列中具有相同值的兩行之間的NAP

v1 v2 
    1 2 
    NA 3 
    NA 2 
    1 1 
    NA 7 
    NA 2 
    3 1 

我基本上是想從以前的非NA的數據幀和replcae的NA列V1年初開始,如果接下來的非NA匹配的前一個。這已經說了,我想要的結果是這樣的:

v1 v2 
    1 2 
    1 3 
    1 2 
    1 1 
    NA 7 
    NA 2 
    3 1   

正如你可能會看到,行2和3與數字「1」替換,因爲行1和4有相同的號碼,但行5,6保持不變,因爲第4行和第7行中的非na值不相同。我一直在玩很多,但到目前爲止沒有運氣。謝謝

回答

4

這是一個使用zoo包的想法。我們基本上在兩個方向上填充NA,並將NA設置爲這些方向之間不相等的值。

library(zoo) 

ind1 <- na.locf(df$v1, fromLast = TRUE) 
df$v1 <- na.locf(df$v1) 
df$v1[df$v1 != ind1] <- NA 

賦予,

v1 v2 
1 1 2 
2 1 3 
3 1 2 
4 1 1 
5 NA 7 
6 NA 2 
7 3 1 
+0

這正是我所做的,並在之前的回覆中提到過。感謝您將這種迴應以一種好的格式。順便說一句,你需要修改最後一行,因爲沒有ind2 – Fatima

+0

順便說一句,它不起作用,當列開始或結束時不適用 – Fatima

+0

這是一個非常重要的細節忽略。雖然我認爲一個簡單的規則應該足夠取決於你想如何處理它們 - 最後一行改變了。對於輸入錯誤 – Sotos

0

我可以用na.locf函數來進行。基本上,我使用普通的na.locf函數包動物園來替換每個NA與最新的先前的非NA並將數據存儲在一列中。通過使用相同的功能,但修復fromlast = TRUE NAs將替換爲第一個下一個nonNA並將它們存儲在另一列中。我檢查了這兩列,如果這兩列的每行結果不匹配,我用NA替換它們。

1

這裏是一個基礎R溶液,該邏輯是幾乎相同索托斯的一個:

replace_na <- function(x){ 
    f <- function(x) ave(x, cumsum(!is.na(x)), FUN = function(x) x[1]) 
    y <- f(x) 
    yp <- rev(f(rev(x))) 
    ifelse(!is.na(y) & y == yp, y, x) 
} 
df$v1 <- replace_na(df$v1) 

測試:

> replace_na(c(1, NA, NA, 1, NA, NA, 3)) 
[1] 1 1 1 1 NA NA 3 
+0

感謝您的回覆。那完美的工作 – Fatima

1

這裏使用fill

library(tidyverse) 
df1 %>% 
    mutate(vNew = v1) %>% 
    fill(vNew, .direction = 'up') %>% 
    fill(v1) %>% 
    mutate(v1 = replace(v1, v1 != vNew, NA)) %>% 
    select(-vNew) 
# v1 v2 
#1 1 2 
#2 1 3 
#3 1 2 
#4 1 1 
#5 NA 7 
#6 NA 2 
#7 3 1 
tidyverse類似的方法
相關問題