Как рассчитать rowMeans столбцов с похожими именами в r? - PullRequest
1 голос
/ 05 мая 2019

У меня есть фрейм данных с похожими названиями. Я хочу вычислить rowMeans столбцов A и B. Как я могу сделать rowMeans между всеми столбцами A и B?

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 ]

2 голосов
/ 06 мая 2019

Опция будет 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 голос
/ 06 мая 2019

Мы можем выполнить итерации по уникальным именам, поместить их в исходный фрейм данных и взять rowMeans.

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

#     A    B
#[1,] 2 6.67
#[2,] 3 7.00
1 голос
/ 06 мая 2019

Другая опция, использующая 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
0 голосов
/ 06 мая 2019

Вам просто нужно отправить кадр данных по нужным столбцам, а затем применить функцию 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...