R中的for循环和if-else语句

时间:2018-04-06 10:33:30

标签: r for-loop if-statement

我在数据框中有两个日期列。一个是DNA提取日期(DNA提取),另一个是BMI提取日期(BMIextraction)。 每对双胞胎都有不止一个BMI提取日期。我想找到哪个BMI提取日期最接近DNA提取日期,并建立一个名为" DATE"的新列。如果BMI提取日期最接近DNA提取日期,则DATE等于"最接近"如果不是DATE则等于BMIextraction。 以下是我的代码,我无法得到我想要的结果。

首先,我使用as.Date并获取DNAextraction和BMIextraction之间的差异以了解最低值。

    A$DNAextraction<-as.Date(A$DNAextraction, "%d/%m/%Y")
    A$BMIextraction<-as.Date(A$BMIextraction, "%d/%m/%Y")
    A$DAYS<-abs(as.numeric(A$BMIextraction-A$DNAextraction))

NEXT,我使用for循环来解决我的问题:

z<-NULL
for(i in unique(A$KCL_ID)){
  RESULT<-A[A$KCL_ID==i]
    if(RESULT$DAYS[RESULT$KCL_ID==i]<-min(RESULT$DAYS[RESULT$KCL_ID==i])){
      RESULT$DATE<-"closest"
    }else{RESULT$DATE<-RESULT$BMIextraction}
z<-rbind(z,RESULT)
  }

以下是我的数据的一个子集:

A <- structure(list(KCL_ID = c(21L, 21L, 21L, 22L, 22L, 22L), 
       KCL_Fam = c(2L, 2L, 2L, 2L, 2L, 2L), 
       Sex = c(FALSE, FALSE, FALSE, FALSE, FALSE, FALSE), 
       Zygosity = structure(c(1L, 1L, 1L, 1L, 1L, 1L), 
         .Label = c("DZ", "MZ"), class = "factor"), 
       Age_at_visit = c(52L, 65L, 68L, 52L, 65L, 68L), 
       BMI = c(26.4, 28.7, 32, 25.3, 25.2, 25.7), 
       BMIextraction = structure(c(14196, 14561, 13329, 13329, 13694, 12930), 
         class = "Date"), 
       DNAextraction = structure(c(12747, 12747, 12747, 12747, 12747, 12747), 
         class = "Date"), 
       DAYS = c(1449, 1814, 582, 582, 947, 183)),
       Names = c("KCL_ID", "KCL_Fam", "Sex", "Zygosity",
                "Age_at_visit", "BMI", "BMIextraction",
                "DNAextraction", "DAYS"), 
       row.names = c(NA, 6L), class = "data.frame") 

1 个答案:

答案 0 :(得分:1)

我不确定我是否完全理解你的问题,但这是我尝试回答一系列我的假设。

我认为,根据KCL_ID,您希望通过创建一个名为DATE的新列,将最接近的BMI提取日期标记为DNA提取日期。对于具有最接近日期的记录,您希望该列的值为字符串&#34;最接近&#34;以及其他方式为BMIExtraction日期。

以下是使用dplyr

执行此操作的方法
library(dplyr)

A <- A %>%
  mutate(DAYS=BMIextraction-DNAextraction) %>%
  group_by(KCL_ID) %>%
  mutate(DATE=ifelse(DAYS==min(DAYS), "closest", as.character(BMIextraction))) %>%
  ungroup()