Использовать значения в R-кадре данных в качестве индекса для подмножества и суммирования другого фрейма данных? - PullRequest
0 голосов
/ 18 января 2019

Я хочу создать новый столбец в кадре данных x, значение которого является средним значением начальной и конечной строк в кадре данных y. Я могу сделать это в цикле, но есть ли функциональный подход, который был бы быстрее с большими данными?

set.seed(1)
x <- data.frame(start = seq(1, 3, 2))
x$end <- x$start + 1

#  start end
#1     1   2
#2     3   4

y <- data.frame(value = runif(4))

#      value
#1 0.2655087
#2 0.3721239
#3 0.5728534
#4 0.9082078

# one way to do it
for (i in 1:nrow(x)){
    x[i, 'mean.value'] <- mean(y$value[x[i,'start']:x[i,'end']])}

# desired result
  start end mean.value
1     1   2  0.3188163
2     3   4  0.7405306 

# could something like this work?
x['mean.value'] <- lapply(x, function(k){???}) 

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Другим способом, используя sapply, циклически перебирая каждую строку в x, мы подставляем соответствующие строки из y и берем mean из них.

x$mean_value <- sapply(seq_len(nrow(x)), function(i) mean(y[unlist(x[i,]),]))
x

#  start end mean_value
#1     1   2  0.3188163
#2     3   4  0.7405306
0 голосов
/ 18 января 2019

Это можно сделать с помощью Map, чтобы получить последовательность индексов из столбцов 'x', установить для этого столбец 'value' в столбце 'value', получить mean и создать значение 'mean.value'столбец в' x '

x['mean.value'] <- sapply(do.call(Map, c(f = `:`, x)), function(x) mean(y$value[x]))
#
#     start end mean.value
#1     1   2  0.3188163
#2     3   4  0.7405306

Его также можно упростить как

x['mean.value'] <- mapply(function(i, j)  mean(y$value[i:j]),  x$start, x$end)

Аналогичным вариантом с tidyverse будет использование map2(от purrr)

library(tidyverse)
x %>%
    mutate(mean.value = map2_dbl(start, end, ~  mean(y$value[.x:.y])))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...