需要帮助删除不一致的行

时间:2016-12-05 21:54:44

标签: r date

请提供以下数据框。

从数据框架来看,我的目标是删除3个月后没有关注的Intake。这是入学日期与3个月之间的差异应该对齐。

第一个循环代码用于生成d1,d2,d3,如下所示

for (i in 2:(length(MyPanelBMIn3[,"UIDhmis"]))) {  
if ((MyPanelBMIn3[i,"UIDhmis"]== MyPanelBMIn3[(i-1),"UIDhmis"]) &    MyPanelBMIn3[i, "Freq"] == MyPanelBMIn3[i-1, "Freq"]) {  
MyPanelBMIn3[i,"dd1"] <- MyPanelBMIn3[i,"Date2"]- MyPanelBMIn3[i-1, "Date2"]  
MyPanelBMIn3[i,"dd2"] <- MyPanelBMIn3[i,"Date2"]- MyPanelBMIn3[i+1, "Date2"]
MyPanelBMIn3[i,"dd3"] <- MyPanelBMIn3[i-1,"Date2"]- MyPanelBMIn3[i+1, "Date2"]    
} else 
if ((MyPanelBMIn3[i,"UIDhmis"]== MyPanelBMIn3[(i-1),"UIDhmis"]) & MyPanelBMIn3[i, "Freq"] != MyPanelBMIn3[i-1, "Freq"]){ 
 MyPanelBMIn3[i,"dd1"] <- MyPanelBMIn3[i,"Date2"]- MyPanelBMIn3[i-1, "Date2"]
 MyPanelBMIn3[i,"dd2"] <- MyPanelBMIn3[i,"Date2"]- MyPanelBMIn3[i+1,    "Date2"]
 }
 } 

DATA:

    UIDhmis CID Freq    Date    Index   d1  d2  d3
1   100 Intake  22/09/2014  1   NA  NA  NA
1   100 Intake  16/04/2012  2   -889    -85 804
1   100 03 Month    10/07/2012  3   85  -84 NA
2   214 Intake  02/09/2013  1   NA  NA  NA
2   214 Intake  05/04/2013  2   -150    -241    -91
2   214 03 Month    02/12/2013  3   241 -90 NA
3   301 Intake  03/11/2015  1   NA  NA  NA
3   301 Intake  15/02/2015  2   -261    -359    -98
3   740 03 Month    09/02/2016  3   359 -6  NA

下面的代码用于比较d1,d2和d3,以便能够确定在第一个和第二个之间下降哪一行&#34;进入&#34;,我遇到了绝对值的错误,如下所示

for (i in 2:(length(MyPanelBMIn5[, "UIDhmis"]))) {
if ((MyPanelBMIn5[i, "UIDhmis"] == MyPanelBMIn5[(i-1), "UIDhmis"]) &         MyPanelBMIn5[i, "Freq"] == MyPanelBMIn5[(i-1), "Freq"] & abs(MyPanelBMIn5[i-1,   "d1"]) > 100 & abs(MyPanelBMIn5[i, "d2"])  <= 100 ) {
MyPanelBMIn6 <- with(MyPanelBMIn5, MyPanelBMIn5$UIDhmis != i-1)
}else 
if ((MyPanelBMIn5[i, "UIDhmis"] == MyPanelBMIn5[i+1, "UIDhmis"]) & MyPanelBMIn5[i, "Freq"] == MyPanelBMIn5[i+1, "Freq"] & abs(MyPanelBMIn5[i+1, "d1"]) < abs(MyPanelBMIn5[(i+1), "d2"])) {
  MyPanelBMIn6 <- with(MyPanelBMIn5, MyPanelBMIn5$UIDhmis != i)
}else if   
((MyPanelBMIn5[i, "UIDhmis"] == MyPanelBMIn5[(i+1), "UIDhmis"]) &           MyPanelBMIn5[i, "Freq"] == MyPanelBMIn5[(i+1), "Freq"] & abs(MyPanelBMIn5[i,  "d1"]) > 100 & abs(MyPanelBMIn5[i, "d2"]) > 100 & abs(MyPanelBMIn5[i, "d3"]) <= 100) {
  MyPanelBMIn6 <- with(MyPanelBMIn5, MyPanelBMIn5$UIDhmis != i)
}
}

错误讯息: abs出错(MyPanelBMIn5 [i - 1,&#34; d1&#34;]):   数学函数的非数字参数

目标是删除不在3个月内的摄入量#03; 03个月&#34;。例如,我想从UIDhmis = 100中删除第1行,因为这个观察远离它的&#34; 03个月&#34;。

在UIDhmis = 214中,第二个&#34;摄入&#34;必须删除,因为它是大约五个月到&#34; 03个月&#34;频率。

有人可以帮助找出我的错误,或者告诉我如何在R中做得更好。我正在使用R版本3.3.2与Window 7 Professional。

谢谢。

1 个答案:

答案 0 :(得分:0)

查找所有&#34; 03月&#34;的行索引。例

rowids <- which(MyPanelBMIn5$CID == '03 Month')

然后创建一个包含这些行的向量以及它们之前的行

rowids <- c(rowids, rowids - 1)

确保每个索引都是唯一且大于0

rowids <- sort(unique(rowids))
rowids <- rowids[rowids > 0]

然后,通过此索引

对原始数据集进行子集化
data_subset <- MyPanelBMIn6[rowids, ]