代码之家  ›  专栏  ›  技术社区  ›  apple

如何对R中数据帧上的值求和?

  •  0
  • apple  · 技术社区  · 6 年前

    我已经在多个论坛上寻找了一个对我有效但没有运气的答案。我可能想得太多了,但任何事情都有帮助!

    我有一个数据框架覆盖率的植被覆盖率在许多网站(网站列在列中,每个物种作为一行)。我想创建一个新的列,计算每个物种存在的站点数量。例如,有多少站点的Salix覆盖率大于0?

    这是一个小数据框,从现在开始。。。(站点和种类分别是列名和行名)

               site1     site2      site3      site4
    Salix      16.50      7.00       7.50       6.00 
    Betula     17.75     19.75       0.00       5.25
    Alnus       0.00      0.00       0.00       0.00
    Picea       0.00      0.35       0.00       0.00
    

    我希望最后一篇专栏如下:

               site1     site2      site3      site4     count
    Salix      16.50      7.00       7.50       6.00         4
    Betula     17.75     19.75       0.00       5.25         3
    Alnus       0.00      0.00       0.00       0.00         0
    Picea       0.00      0.35       0.00       0.00         1
    

    我已经让count函数一次只能工作一行,但是在整个数据帧(比我在这里显示的要大得多)的自动化方面遇到了困难。

    sum(df[1, ] > 0)
    [1] 4
    
    sum(df[2, ] > 0)
    [1] 3
    

    我试过这样的循环:

    #First I created an empty column
    df$count <- NA
    
    #Then I tried to populate that column
    for(i in 1:nrow(df)){
      df$count <- sum(df[i, 1:ncol(df) - 1] > 0)
    
    Error in df$count[i, ] <- sum(df[i, 1:ncol(df) - 1] > 0) : 
      incorrect number of subscripts on matrix
    

    df$count <- lapply(df, MARGIN = 1, FUN = function(x) sum(x > 0))
    Error in FUN(X[[i]], ...) : unused argument (MARGIN = 1)
    

    当我尝试删除MARGIN参数时,我得到一个错误,它将列与行混淆(这个错误来自我的实际数据,即79列乘38行):

    Error in `$<-.data.frame`(`*tmp*`, sites, value = list(`site1` = 15L,  : 
      replacement has 79 rows, data has 38
    

    有什么指导吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   denis    6 年前

    具有 apply :

    df$count <- apply(df,1,function(x){sum(x>0)})
    

    具有 rowSums

    df$count <- rowSums(df>0)
    

    结果:

           site1 site2 site3 site4 count
    Salix  16.50  7.00   7.5  6.00     4
    Betula 17.75 19.75   0.0  5.25     3
    Alnus   0.00  0.00   0.0  0.00     0
    Picea   0.00  0.35   0.0  0.00     1
    

    数据:

    df <- read.table(text = "           site1     site2      site3      site4
    Salix      16.50      7.00       7.50       6.00 
    Betula     17.75     19.75       0.00       5.25
    Alnus       0.00      0.00       0.00       0.00
    Picea       0.00      0.35       0.00       0.00")