Рассчитать среднее значение столбца на основе (частичного) совпадения имен строк - PullRequest
0 голосов
/ 14 сентября 2018

Я уверен, что это очень простая проблема, но я не могу понять это.У меня есть набор данных с частично совпадающими именами строк, такими как AA.11 AB.11 AC.11 AA.12 AB.12 AC.12 и т. Д. Я хотел бы иметь возможность легко рассчитать и нанести на график значения столбцов для различных подмножеств, например, для всех, содержащих «AA» в или «.12» в названии.

X<-c(1,2,3,4,5,6,7,8,9)
Y<-c(2,4,6,8,10,12,14,16,18)
Z<-c(1,3,5,7,10,13,16,19,22)

Name<-c("AA.11", "AA.12", "AA.13", "AB.11", "AB.12", "AB.13", "AC.11", 
"AC.12", "AC.13")

DF<-data.frame(Name,X,Y,Z)

Я следовал решениям, предложенным в этой теме: Рассчитать среднее значение строки на основе (частичного) совпадения имен столбцов

rownames = c("AA", "AB", "AC", ".11", ".12", ".13")
sapply(rownames, function(x) colMeans(DF [grep(x, names(DF)), ]))

, но затем получилсяпустая матрицаЛюбая помощь будет принята с благодарностью.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Вот альтернативный подход с использованием tidyverse

X<-c(1,2,3,4,5,6,7,8,9)
Y<-c(2,4,6,8,10,12,14,16,18)
Z<-c(1,3,5,7,10,13,16,19,22)

Name<-c("AA.11", "AA.12", "AA.13", "AB.11", "AB.12", "AB.13", "AC.11", "AC.12", "AC.13")

DF<-data.frame(Name,X,Y,Z)

library(tidyverse)

df_res = tibble(rownames = c("AA", "AB", "AC", ".11", ".12", ".13")) %>%  # save rownames of interest as a tibble
  mutate(d = map(rownames, ~DF[grep(.x, DF$Name),]),                      # get the corresponding subsets
         c_means = map(d, ~colMeans(.x[-1]))) %>%                         # get the corresponding column means
  print()                                                                 # print result

# # A tibble: 6 x 3
#     rownames d                    c_means  
#     <chr>    <list>               <list>   
#   1 AA       <data.frame [3 x 4]> <dbl [3]>
#   2 AB       <data.frame [3 x 4]> <dbl [3]>
#   3 AC       <data.frame [3 x 4]> <dbl [3]>
#   4 .11      <data.frame [3 x 4]> <dbl [3]>
#   5 .12      <data.frame [3 x 4]> <dbl [3]>
#   6 .13      <data.frame [3 x 4]> <dbl [3]>

Пока у вас есть вывод, в котором хранятся подмножества (d), процесс, используемый для получения значений столбца и самих столбцов (c_means), для каждого предоставленного вами rowname.

Вы можете получить доступ к тем хранимым переменным, как это:

# see the subset used for AC
df_res$d[df_res$rownames == "AC"]

# [[1]]
#   Name X  Y  Z
# 7 AC.11 7 14 16
# 8 AC.12 8 16 19
# 9 AC.13 9 18 22


# see the column means for AC
df_res$c_means[df_res$rownames == "AC"]

# [[1]]
# X  Y  Z 
# 8 16 19 


# see all column means
df_res$c_means

# [[1]]
# X Y Z 
# 2 4 3 
# 
# [[2]]
# X  Y  Z 
# 5 10 10 
# 
# [[3]]
# X  Y  Z 
# 8 16 19 
# 
# [[4]]
# X Y Z 
# 4 8 8 
# 
# [[5]]
# X        Y        Z 
# 5.00000 10.00000 10.66667 
# 
# [[6]]
# X        Y        Z 
# 6.00000 12.00000 13.33333 
0 голосов
/ 14 сентября 2018

Вам нужно использовать DF$Name в функции grep вместо names(DF)

, чтобы код выглядел

rownames = c("AA", "AB", "AC", ".11", ".12", ".13") 
sapply(rownames, function(x) colMeans(DF [grep(x, DF$Name), ]))

, так как вы ищете средство базызначение в столбце Имя, а не имена столбцов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...