применить функцию, берущую два вектора над строками фрейма данных - PullRequest
0 голосов
/ 12 мая 2018

Я пытаюсь применить функцию Hmisc wdt.mean к строкам фрейма данных.Обычно требуется два вектора, один для средних и один для весов средних.Я пытался найти решение dplyr / tidyr / purrr, но не смог понять его.

library(Hmisc)

#build data frame with 10 weight columns and 10 mean columns
set.seed(10)
w = matrix(runif(200,0,1),ncol = 20)
w = w/rowSums(w)
m = matrix(runif(200,50,100),ncol = 20)
df <- as.data.frame(cbind(w,m))
colnames(df) <- c(paste0("weight",seq(1,20,1)),paste0("mean",seq(1,20,1)))

# calculate weighted means for each row
for (i in 1:nrow(df)) {
  df$weighted.means [i] <-  wtd.mean(x =as.numeric(df[i,21:40]), weights = as.numeric(df[i,1:20]) )
}
> df$weighted.means
 [1] 70.74705 82.85015 82.40826 73.35798 70.02986 74.05543 73.64709 77.12899 72.56236 84.74055

1 Ответ

0 голосов
/ 12 мая 2018

Вы можете сделать:

df %>% 
  mutate(weighted.means = apply(df, 1, function(x) wtd.mean(x = as.numeric(x[21:40]), 
                                                            weights = as.numeric(x[1:20]))))

или используйте это (длинное ...) решение для приведения в движение:

df %>% 
  rownames_to_column("group") %>% 
  gather(name, value, -group) %>% 
  extract(name, into = c("weight_mean", "number"), regex = "([[:alpha:]]+)(\\d+)") %>% 
  spread(weight_mean, value) %>% 
  group_by(group = as.numeric(group)) %>% 
  summarise(weighted.means = wtd.mean(x = mean, weights = weight))

# A tibble: 10 x 2
#    group weighted.means
#    <dbl>          <dbl>
#  1 1               70.7
#  2 2               82.9
#  3 3               82.4
#  4 4               73.4
#  5 5               70.0
#  6 6               74.1
#  7 7               73.6
#  8 8               77.1
#  9 9               72.6
# 10 10              84.7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...