【问题标题】:R: Summing values of columns through a loopR:通过循环对列的值求和
【发布时间】:2016-04-07 07:11:51
【问题描述】:

我对 R 和这个论坛真的很陌生,需要帮助构建一个循环。 (我是一名生物学专业的学生,​​编程经验几乎为零)。

我的数据框具有以下(简化的)结构:

    a = "TNS"
    b = NA
    c = NA
    d = 21
    e = 37
    f = 1
    g = 39
    h = 29
    df = data.frame (a,b,c,d,e,f,g,h)

实际上,我的数据框由 210 行和 90 列组成,但我现在对其他行并不真正感兴趣。 我正在寻找的是一种将除前三列之外的每一列的值相加的方法,并将这些结果作为新列自动添加到我的数据框的末尾。 这将优先生成如下 data.frame:

    a = "TNS"
    b = NA
    c = NA
    d = 21
    e = 37
    f = 1
    g = 39
    h = 29
    de = 58
    df = 22
    dg = 60
    dh = 50
    ef = 38
    eg = 76
    eh = 66
    fg = 40
    fh = 30
    gh = 68
    df = data.frame (a,b,c,d,e,f,g,h,de,df,dg,dh,ef,eg,eh,fg,fh,gh)

每列不能多次配对。并且为每个配对运行循环后,我需要为每个三重列、四重列等执行此操作。

我为什么要这样做?我需要为一个生物多样性研究项目的 85 列执行此操作,并且手动计算每个组合的值会花费太多时间。

任何帮助将不胜感激,因为我真的没有使用 R 的经验来自己提出解决方案!!!

【问题讨论】:

    标签: r loops calculated-columns


    【解决方案1】:

    您可以将combnrowSums 结合使用,如下所示:

    ## This creates the names for the new columns we'll be creating
    nam <- combn(names(df)[-c(1, 2, 3)], 2, FUN = function(x) paste(x, collapse = ""))
    
    ## Create and assign to your original data.frame
    df[nam] <- combn(names(df)[-c(1, 2, 3)], 2, 
                     FUN = function(x) rowSums(df[x], na.rm = TRUE), simplify = FALSE)
    df
    #      a  b  c  d  e  f g h de df dg dh ef eg eh fg fh gh
    # 1  TNS NA NA  3  3 10 5 9  6 13  8 12 13  8 12 15 19 14
    # 2  TNS NA NA  4  2  3 6 7  6  7 10 11  5  8  9  9 10 13
    # 3  TNS NA NA  6  7  7 5 8 13 13 11 14 14 12 15 12 15 13
    # 4  TNS NA NA 10  4  2 2 6 14 12 12 16  6  6 10  4  8  8
    # 5  TNS NA NA  3  8  3 9 6 11  6 12  9 11 17 14 12  9 15
    # 6  TNS NA NA  9  5  4 7 8 14 13 16 17  9 12 13 11 12 15
    # 7  TNS NA NA 10  8  1 8 1 18 11 18 11  9 16  9  9  2  9
    # 8  TNS NA NA  7 10  4 2 5 17 11  9 12 14 12 15  6  9  7
    # 9  TNS NA NA  7  4  9 8 8 11 16 15 15 13 12 12 17 17 16
    # 10 TNS NA NA  1  8  4 5 7  9  5  6  8 12 13 15  9 11 12
    

    这是用于此答案的示例数据:

    set.seed(1)
    df <- data.frame(a = "TNS", b = NA, c = NA, 
               matrix(sample(10, 50, TRUE), ncol = 5, 
                      dimnames = list(NULL, c("d", "e", "f", "g", "h"))))
    df
    #      a  b  c  d  e  f g h
    # 1  TNS NA NA  3  3 10 5 9
    # 2  TNS NA NA  4  2  3 6 7
    # 3  TNS NA NA  6  7  7 5 8
    # 4  TNS NA NA 10  4  2 2 6
    # 5  TNS NA NA  3  8  3 9 6
    # 6  TNS NA NA  9  5  4 7 8
    # 7  TNS NA NA 10  8  1 8 1
    # 8  TNS NA NA  7 10  4 2 5
    # 9  TNS NA NA  7  4  9 8 8
    # 10 TNS NA NA  1  8  4 5 7
    

    【讨论】:

    • @JasperBunschoten,没问题。很高兴能提供帮助。
    猜你喜欢
    • 1970-01-01
    • 2020-08-28
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 2015-06-09
    • 2014-08-30
    • 2016-02-15
    相关资源
    最近更新 更多