【问题标题】:How to calculate rowMeans of columns with similar colnames in r?如何计算r中具有相似列名的列的rowMeans?
【发布时间】:2019-05-06 07:08:19
【问题描述】:

我有一个具有相似列名的数据框。 我想计算 A 列和 B 列的 rowMeans。 如何在所有 A 列和 B 列之间执行 rowMeans?

df <- data.frame(A1=c(1,2),A2=c(3,4),A3=c(5,6),A4=c(7,7),A5=c(8,8),A6=c(9,9)) 
colnames(df)<- c("A","A","B","B","B","C")

【问题讨论】:

  • 一般来说,在 R 中具有相同的列名会使处理事情变得困难。例如,在上面的列重命名之后,当您执行df$A 时会发生什么?这是模棱两可的。此外,“计算 rowMeans between” 是什么意思?这是对我来说没有意义的中间部分......计算不是“中间”的事情。
  • 是的。你说的对。 “之间”不是合适的词。

标签: r dataframe


【解决方案1】:

一个选项将split 由相似的列名转换成list 然后得到rowMeans

i1 <- grep("^(A|B)", names(df))
sapply(split.default(df[i1], names(df)[i1]), rowMeans)
#     A        B
#[1,] 2 6.666667
#[2,] 3 7.000000

【讨论】:

    【解决方案2】:

    我们可以遍历唯一名称,从原始数据帧中对它们进行子集化,然后采用 rowMeans

    sapply(c("A", "B"), function(x) rowMeans(df[,colnames(df) == x]))
    
    #     A    B
    #[1,] 2 6.67
    #[2,] 3 7.00
    

    【讨论】:

      【解决方案3】:

      另一个使用tidyverse的选项:

      library(tidyverse)
      
      df[, "rn"] <- 1:nrow(df)
      
      df %>% 
        gather(letter, value, -rn) %>% 
        mutate(letter = str_extract(letter, "[:alpha:]")) %>% 
        group_by(letter, rn) %>% 
        summarize(sum = mean(value)) %>% 
        filter(letter %in% c("A", "B"))
      
      #> # A tibble: 4 x 3
      #> # Groups:   letter [2]
      #>   letter    rn   sum
      #>   <chr>  <int> <dbl>
      #> 1 A          1  2   
      #> 2 A          2  3   
      #> 3 B          1  6.67
      #> 4 B          2  7
      

      【讨论】:

        【解决方案4】:

        您只需按您想要的列提交数据框,然后应用rowMeans() 函数。

        df <- data.frame(A1=c(1,2),A2=c(3,4),A3=c(5,6),A4=c(7,7),A5=c(8,8),A6=c(9,9)) 
        colnames(df)<- c("A","A","B","B","B","C")
        rowSums(df[,which(colnames(df) %in% c("A","B"))])
        #[1] 24 27
        

        但是,正如 r2evans 在评论中指出的那样,您应该避免使用相同名称的列。您只想获取确定子集之间的列数的开始和结束的列的位置。

        colnames(df) <- c(paste0("A",1:2), paste0("B", 1:3), "C1")
        strt <- which(colnames(df) == "A1")
        end <- which(colnames(df) == "B3")
        columrange <- strt:end
        rowSums(df[,columrange])
        #[1] 24 27
        

        有很多方法可以按列名进行子集化。如果您没有在示例中重命名列,则可以使用 grepl() 来查找它们:

        df[,grepl("A",colnames(df)) | grepl("B",colnames(df))]
        #  A1 A2 B1 B2 B3
        #1  1  3  5  7  8
        #2  2  4  6  7  8
        

        【讨论】:

          猜你喜欢
          • 2022-06-21
          • 1970-01-01
          • 2021-05-02
          • 2021-08-20
          • 1970-01-01
          • 2018-08-12
          • 2022-07-20
          • 1970-01-01
          • 2019-10-18
          相关资源
          最近更新 更多