2017-03-05 28 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