【问题标题】:Why does my for-loop with if-statement not work?为什么我的带有 if 语句的 for 循环不起作用?
【发布时间】:2021-07-09 08:17:24
【问题描述】:

对不起,如果这有一个明显的解决方案,但我对条件语句不是很熟悉,我已经被这个问题困扰了一段时间,我一直无法找到错误。

我有一个看起来像这样的数据框,还有几列临床数据:

> samples[,c(2,360,361)]
     patient_id  sample_id timepoint
d1.18    1056023 1056023.d1        d1
d1.4     3278638 3278638.d1        d1
d1.37     858412  858412.d1        d1
d4.4     3278638 3278638.d4        d4
d4.31     467506  467506.d4        d4
d4.29    1064441 1064441.d4        d4
d1.29    1064441 1064441.d1        d1
d4.37     858412  858412.d4        d4
d4.22     967710  967710.d4        d4
d1.52     294224  294224.d1        d1
d4.51     907354  907354.d4        d4

对于某些患者,我在两个不同的时间点有两个样本:d1 和 d4。对于其他人,我只有 d1 或 d4。我想为每个患者只选择一个样本,如果有两个样本可用,则选择 d1。我的最终数据框应如下所示:

> samples[,c(2,360,361)]
      patient_id  sample_id timepoint
d1.18    1056023 1056023.d1        d1
d1.4     3278638 3278638.d1        d1
d1.37     858412  858412.d1        d1
d4.31     467506  467506.d4        d4
d1.29    1064441 1064441.d1        d1
d4.22     967710  967710.d4        d4
d1.52     294224  294224.d1        d1
d4.51     907354  907354.d4        d4

这是我的做法:

for(i in unique(samples$patient_id)){
  if((sum(samples$patient_id == i)) == 2){
    samples <- samples[-(samples$patient_id == i & samples$timepoint == d4),]
  }
}

虽然我的最终数据框的行数与 unique(samples$patient_id) 中的长度相同,但一些患者已经完全消失,而其他患者仍然有两个样本。

除了从原始数据框中删除行之外,我还尝试将我想要的行存储在一个空列表中,或者使用患者和时间点列生成样本名称,如下所示:

patients <- unique(samples$patient_id)
dat <- list()

for(i in patients){
  
  if((sum(samples$patient_id == i)) == 2){
    dat[[i]] <- paste(i, "d1", sep = ".")
  }else if ((sum(samples$patient_id == i)) == 1){
    dat[[i]] <- paste(i, "d4", sep = ".")
  } else{
    NULL
  }
}

但这会产生一个包含 1314182 个元素的列表。

如果有任何帮助,我将不胜感激!

【问题讨论】:

    标签: r for-loop if-statement


    【解决方案1】:

    一个更简单的解决方案是:

    library(dplyr)  
                            
    samples %>%
      arrange(patient_id, timepoint) %>%
      distinct(patient_id, .keep_all = TRUE)
    

    结果:

         id patient_id  sample_id timepoint
    1 d1.52     294224  294224.d1        d1
    2 d4.31     467506  467506.d4        d4
    3 d1.37     858412  858412.d1        d1
    4 d4.51     907354  907354.d4        d4
    5 d4.22     967710  967710.d4        d4
    6 d1.18    1056023 1056023.d1        d1
    7 d1.29    1064441 1064441.d1        d1
    8  d1.4    3278638 3278638.d1        d1
    

    【讨论】:

      猜你喜欢
      • 2021-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-29
      • 1970-01-01
      相关资源
      最近更新 更多