请提供以下数据框。
从数据框架来看,我的目标是删除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。
谢谢。
答案 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, ]