gpt4 book ai didi

r - 在 R 中匹配和汇总数据框

转载 作者:行者123 更新时间:2023-12-01 09:55:22 25 4
gpt4 key购买 nike

我有一个包含时间序列数据列以及开始年份和结束年份的数据框。

df = data.frame(y2000=c(12,636),y2001=c(234, 76),y2002=c(3434, 46),y2003=c(36,35),y2004=c(6, 64),   y2005=c(56,65), y2006=c(43,65), y2007=c( 6, 56),y2008=c( 64, 66),y2009=c(63, 5656),y2010 = c(65,54),startyear= c(2006, 2001), endyear= c(2009, 2005))

对于每一行,我想计算开始和结束年份内以及开始和结束期间之前和之后的平均值。所需的输出如下所示:

y2000   y2001   y2002   y2003   y2004   y2005   y2006   y2007   y2008   y2009   y2010   startyear   endyear before_mean within_mean  after_mean
12 234 3434 36 6 56 43 6 64 63 65 2006 2009 629.6666667 44 65
636 76 46 35 64 65 65 56 66 5656 54 2001 2005 636 57.2 1179.4

我尝试过不同的匹配和索引技术,但无法完全理解这个。

最佳答案

<强>1。 dplyr/tidyr

将“宽”格式转换为“长”格式可能会更好。我们可以使用 dplyr/tidyr得到mean .创建一个“ind”列,使用 gather 将数据 reshape 为“long” , 用 extract 将 'variable' 列分成两列 ('var1', 'var2') ,按'ind'分组,得到mean根据创建的不同逻辑索引(即 var2 < startyearvar2 >= startyear & var2 <= endyearvar2 >endyear)对其进行子集化后的“值”列的值

library(dplyr)
library(tidyr)

dS <- df %>%
mutate(ind=row_number()) %>%
gather(variable, value, starts_with('y')) %>%
extract(variable, c('var1', 'var2'), '([^0-9]+)([0-9]+)',
convert=TRUE) %>%
group_by(ind) %>%
summarise(before_mean= mean(value[var2 < startyear]),
within_mean = mean(value[var2 >= startyear &
var2 <= endyear]),
after_mean=mean(value[var2 >endyear])) %>%
as.data.frame()

nm1 <- paste(c('before', 'within', 'after'), 'mean', sep="_")
dS
# ind before_mean within_mean after_mean
#1 1 629.6667 44.0 65.0
#2 2 636.0000 57.2 1179.4

我们可以根据上面的输出在 'df' 中创建额外的列

df[nm1] <- dS

<强>2。碱基 R

我们可以使用base R方法并且不改变数据集的格式。从原始数据集 ('df') 中,创建数字列名称的索引 ('indx'),删除非数字部分并转换为数字 ('v1')。

 indx <- grep('\\d+', names(df))
v1 <- as.numeric(sub('[^0-9]+', '', names(df)[indx]))

循环 'df' ( lapply ), match 的行'startyear' 与 'v1',使用该索引 ('i1') 获取列,unlist , 并计算 mean .同样可以通过将“endyear”与“v1”匹配以获得索引(“i2”)来完成。基于'i1'和'i2',计算'within_mean'和'after_mean'。 rbind列表元素并将输出分配给“df”中的新列(“nm1”)。

df[nm1] <- do.call(rbind,lapply(1:nrow(df), function(i) {
i1 <- match(df$startyear[i], v1)
before_mean<- mean(unlist(df[i,1:(i1-1),drop=FALSE]))
i2 <- match(df$endyear[i], v1)
within_mean <- mean(unlist(df[i,i2:i1]))
after_mean <- mean(unlist(df[i,match(v1[(i2+1):length(v1)],v1)]))
data.frame(before_mean,within_mean, after_mean) }))
df[nm1]
# before_mean within_mean after_mean
#1 629.6667 44.0 65.0
#2 636.0000 57.2 1179.4

关于r - 在 R 中匹配和汇总数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29186696/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com