簡體   English   中英

如何計算R中具有相似名稱的列的rowMean?

[英]How to calculate rowMeans of columns with similar colnames in r?

我有一個具有相似名稱的數據框。 我想計算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")

一個選項將被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

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

我們可以遍歷唯一的名稱,從原始數據幀rowMeans其子集化,並采用rowMeans

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

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

您只需要通過所需的列提交數據rowMeans() ,然后應用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM