【问题标题】:Writing a loop to apply ifelse for each column individually (in R)编写一个循环以分别为每一列应用 ifelse(在 R 中)
【发布时间】:2020-12-14 01:41:45
【问题描述】:

我是编写循环的新手,我一直在努力解决这个问题。

我有一个数据框,其中需要单独对每一列应用唯一阈值。如果该值高于阈值,则保留原始值。如果低于,则转换为 0。

这只是一个精简的数据框Data.t 作为示例。

         Peptide.1 Peptide.2 Peptide.3
MF.001      -0.01      0.04      0.04
MF.006       0.02      0.05     -0.02
MF.007       0.03      0.05      0.06
MF.015       0.00      0.04      0.05
QEM.219     -0.02      0.02      0.01
QEM.234      0.41      0.15      0.02
QEM.277     -0.04      0.00      0.03
QEM.409      0.00      0.00      0.00

这是单独的阈值作为单独的数据框threshold

          V1    V2    V3
threshold 0.236 0.172 0.176 

我已经使用 ifelse 函数弄清楚了第一部分。

Data.n$Peptide.1 <- ifelse(Data.t$Peptide.1 > threshold$V1, Data.t$Peptide.1, 0)

这会给我:

        Peptide.1 
MF.001       0.00      
MF.006       0.00      
MF.007       0.00      
MF.015       0.00      
QEM.219      0.00      
QEM.234      0.41      
QEM.277      0.00      
QEM.409      0.00

但是现在,我想将各个阈值应用于所有列,即threshold$V2Data.t$Peptide.2 等等。我知道我可以单独执行此操作,但我总共有 84 列。将来我还会有更多这样的数据帧,所以我认为编写一个循环会有所帮助。

我能得到一些帮助吗?

我确信这是一件超级简单的事情,但我尝试编写许多不同的 for 循环,但都失败了。

非常感谢!

【问题讨论】:

    标签: r loops for-loop if-statement


    【解决方案1】:

    您可以使threshold 的行数等于Data.t 并比较数据帧。

    result <- Data.t * +(Data.t > threshold[rep(1, nrow(Data.t)), ])
    

    +(Data.t &gt; threshold[rep(1, nrow(Data.t)), ]) 部分给出 1/0 值。因此,如果Data.t 中的值大于对应的threshold,则返回 1,否则返回 0。然后将这些值与 Data.t 相乘,因此大于阈值的值保持原样,小于阈值的值将变为 0,从而避免使用ifelse

    【讨论】:

    • 非常感谢罗纳克!它工作得很好,它也是一个非常聪明的选择!只是想知道这是否也可以很容易地合并到一个循环中?看到我将来可能有很多数据和阈值电子表格。
    • 所以您的意思是对列表中的多个数据集执行此操作?你可以使用Map 来做到这一点。是的,for 循环也可以使用。
    • 太棒了,谢谢罗纳克!您介意快速向我展示您将如何使用 Map 或 for 循环来编写它吗?我在编写循环方面还是很新的。再次感谢!
    • 您可能应该将其作为一个新问题提出,但让我在这里快速向您展示。如果您的Data.t 列表称为list_datathreshold 列表称为list_threshold,您可以使用result &lt;- Map(function(x, y) x * +(x &gt; y[rep(1, nrow(x)), ]), list_data, list_threshold)
    • 如果速度是个问题,那么您应该考虑使用:Data.t * t(t(Data.t) &gt; unlist(threshold)) 而不是 rep 部分
    猜你喜欢
    • 2016-10-17
    • 2015-11-01
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    相关资源
    最近更新 更多