2017-03-05 27 views
0

我剛合併了R中的縱向數據並發現了一個問題。我的數據幀,DF,長相(大致)是這樣的:在兩列上有條件地賦值或刪除行

Clinic ID Year Result 
A   1 2000  50 
A   1 2002 
A   1 2004  
A   2 2000  
A   2 2002  
A   2 2004  1100 
B   1 2000 
B   1 2002 
B   1 2004 

我們需要的所有年的數據爲患者測試結果和分配結果值該患者的所有行的方式。我需要丟棄沒有結果記錄的患者。在這個例子中,我需要在診所A保留患者1和2的所有行,但在診所B處丟棄患者1的所有行。此外,在診所,AI需要所有患者1的行列出「50」,因爲是他的測試結果。我想最終我可以使用:df [!is.na(df $ Result),] ...但我無法弄清楚如何在刪除之前將'Result'值共享到所有相關行新加坡。

df <- transform(df, NewResult = (Clinic, ID, Fun=Function(Result) ifelse(Result>0 == Result, NA)) 

這沒有奏效;它返回一個錯誤。非常感謝指導。

我需要的是:

Clinic ID Year Result 
A   1 2000  50 
A   1 2002  50 
A   1 2004  50 
A   2 2000  1100 
A   2 2002  1100 
A   2 2004  1100 
B   1 2000  NA 
B   1 2002  NA 
B   1 2004  NA 

回答

1

我們可以na.locfzoo做到這一點,填補了NA值由「診所」和「ID」

library(data.table) 
library(zoo) 
setDT(df)[, Result := na.locf(na.locf(Result, na.rm = FALSE), 
         fromLast=TRUE, na.rm = FALSE), .(Clinic, ID)] 
分組後的值與非NA

或者我們可以使用filltidyverse

library(tidyverse) 
df %>% 
    group_by(Clinic, ID) %>% 
    fill(Result) %>% 
    fill(Result, .direction = "up")  
# Clinic ID Year Result 
# <chr> <int> <int> <int> 
#1  A  1 2000  50 
#2  A  1 2002  50 
#3  A  1 2004  50 
#4  A  2 2000 1100 
#5  A  2 2002 1100 
#6  A  2 2004 1100 
#7  B  1 2000  NA 
#8  B  1 2002  NA 
#9  B  1 2004  NA 
+1

na.locf工作!雖然我無法得到逆向填充,但第一個解決了我的問題。非常感謝! – Quixotic