簡體   English   中英

使用 R 數據幀中的值作為索引來子集和匯總另一個數據幀?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM