[英]Use values in R dataframe as index to subset and summarize another dataframe?
我想在數據幀 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){???})
可以使用Map
完成從“x”列中獲取索引序列,根據該序列對“y”的“value”列進行子集化,獲取mean
並在“x”中創建“mean.value”列
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])))
另一種使用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.