R 如果数据帧值是相应控制值的两倍,则更改数据帧值

R 如果数据帧值是相应控制值的两倍,则更改数据帧值,r,dataframe,R,Dataframe,在R中,我有一个数据框,其中30000多行是数据集群,100列是数据出现的样本/控件 如果任何控件值不是0,则低于该行的编辑:控件值两倍的样本值必须变为0 控制值可以修改为0或保持不变:过滤数据后将删除这些列 数据帧如下所示: sampleID <- c('clust1', 'clust2', 'clust3') sample1 <- c(50, 0, 70) sample2 <- c(0,40,5) sample3 <- c(10,20,0) control1 <

在R中,我有一个数据框,其中30000多行是数据集群,100列是数据出现的样本/控件

如果任何控件值不是0,则低于该行的编辑:控件值两倍的样本值必须变为0

控制值可以修改为0或保持不变:过滤数据后将删除这些列

数据帧如下所示:

sampleID <- c('clust1', 'clust2', 'clust3')
sample1 <- c(50, 0, 70)
sample2 <- c(0,40,5)
sample3 <- c(10,20,0)
control1 <- c(10,2,0)
control2 <- c(0,30,0)
df <- data.frame(sampleID, sample1, sample2, sample3, control, control)

df
    ClusterID sample1 sample2 sample3 control control
    clust1    50      0       10      10       0  
    clust2    0       40      20      2        30
    clust3    70      5       0       0        0 
df
    ClusterID sample1 sample2 sample3 control control
    clust1    50      0       0       0       0  
    clust2    0       0       0       0       0
    clust3    70      5       0       0       0

  
我用lapply试过的(没有成功)

#列表控件
负控制=c(“控制1”、“控制2”)
行\u至\u替换=列表()
sapply(负控,功能(nc){
温度0,]
#检查要筛选的值

值基于显示的条件

nm1 <- names(df)[startsWith(names(df), 'control')]
mx <-  do.call(pmax, df[nm1])
i1 <- mx > 0
nm2 <- grep("^sample\\d+$", names(df), value = TRUE)
df[i1, nm2][df[i1, nm2] < 2 * mx[i1]] <- 0

nm1基于显示的条件

nm1 <- names(df)[startsWith(names(df), 'control')]
mx <-  do.call(pmax, df[nm1])
i1 <- mx > 0
nm2 <- grep("^sample\\d+$", names(df), value = TRUE)
df[i1, nm2][df[i1, nm2] < 2 * mx[i1]] <- 0

nm1您的示例中的控制值是什么?您是否检查了相应的“样本”、“控制”对。在这种情况下,您的示例中的控制值是什么?您是否检查了相应的“样本”、“控制”对。在这种情况下,“样本3”没有“控制”谢谢您的评论!尽管你提出的答案与我所需要的并不完全一致,它非常有用。我给了我足够的指导,让我想出了自己的解决方案(请参见编辑)。如果你删除
[col(df[i1,nm2]),我可以勾选你的答案
从您的回答中,它完全符合预期。我发现它有效,并且比一周前的想法快得多。干杯。谢谢您的评论!虽然您提出的答案与我的需要不完全一致,但它非常有用。我给了我足够的指导,让我想出了自己的解决方案(请参见编辑)。如果您从答案中删除
[col(df[i1,nm2])]
,我可以勾选您的答案,然后它完全按照预期工作。我发现这很有效,而且比我一周前想象的要快得多。干杯。
nm1 <- names(df)[startsWith(names(df), 'control')]
mx <-  do.call(pmax, df[nm1])
i1 <- mx > 0
nm2 <- grep("^sample\\d+$", names(df), value = TRUE)
df[i1, nm2][df[i1, nm2] < 2 * mx[i1]] <- 0