如何计算R中具有相似名称的列的rowMean?

时间:2019-05-05 20:27:55

标签: r dataframe

我有一个具有相似名称的数据框。 我想计算列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")

4 个答案:

答案 0 :(得分:2)

将类似的列名将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

答案 1 :(得分:1)

使用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

答案 2 :(得分:1)

我们可以遍历唯一的名称,从原始数据帧中将其子集化,并取rowMeans

sapply(c("A", "B"), function(x) rowMeans(df[,colnames(df) == x]))

#     A    B
#[1,] 2 6.67
#[2,] 3 7.00

答案 3 :(得分:0)

您只需要按所需的列提交数据框,然后应用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