【发布时间】: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