【问题标题】:Code in R to conditionally subtract columns in data framesR中的代码有条件地减去数据框中的列
【发布时间】:2020-08-03 09:59:27
【问题描述】:

我有一个来自测量的数据框,其中每次测量都会测量背景:

 Wavelength   Background_1   1   Background_2   2   ...
 300          5              11  4              12  ...
 301          3              12  5              10  ...
 ...          ...            ... ...            ... ...

我想从相应的列中减去适当的“Background_xyz”列(例如,从“1”中减去“Background_1”。然后看起来像这样:

 Wavelength   1_corrected   2_corrected   ...
 300          6             8             ...
 301          9             5             ...
 ...          ...           ...           ...

我可以做到这一点没问题。问题是,有时有 3 个测量值,因此 3 列各有背景和“真实”数据,有时只有 1 或 2 个测量值。我正在寻找一种方法来通过减去与列数无关的背景来获得 R“正确”列。我在想也许if 函数检查列名会达到目的,但我还没有足够的经验来想办法做到这一点。 非常感谢您的帮助!

【问题讨论】:

    标签: r dataframe if-statement


    【解决方案1】:

    你可以先用grep找到只有数字的列,然后你可以得到对应的"Background"列并减去。

    cols <- grep('^\\d+$', names(df), value = TRUE)
    new_cols <- paste0(cols, '_corrected')
    df[new_cols] <- df[cols] - df[paste0('Background_', cols)]
    df[c("Wavelength", new_cols)]
    
    #  Wavelength 1_corrected 2_corrected
    #1        300           6           8
    #2        301           9           5
    

    数据

    df <- structure(list(Wavelength = 300:301, Background_1 = c(5L, 3L), 
    `1` = 11:12, Background_2 = 4:5, `2` = c(12L, 10L)), 
    class = "data.frame", row.names = c(NA, -2L))
    

    【讨论】:

    • 感谢您的回复,我只是想知道您为什么使用“new_cols”,因为我没有看到它被定义,并且当我尝试按照您的建议使用它时出现错误
    • @Nuramon 对不起,我忘了包括这条线。更新了答案。你现在可以检查吗?
    • 我现在得到一个不同的错误:不能对不存在的列进行子集化。 x 列 Background_1Background_2Background_3 不存在。
    • @Nuramon 请根据您的真实数据调整答案。检查数据中的列名和显示的列名。您是否真的有名称为“1”、“2”等的列,或者它们的名称不同。如果您无法根据您的数据调整答案,请使用 dput(head(df)) 而不是 ....... 添加您的数据,以便我们提供帮助。
    • 我发现了错误(就我而言),谢谢您的帮助!
    猜你喜欢
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多