gpt4 book ai didi

r - 将基准年索引添加到具有多个组的 R 数据框

转载 作者:行者123 更新时间:2023-12-04 10:44:50 24 4
gpt4 key购买 nike

我有一个包含很少分组变量的年度时间序列数据框,我需要添加一个基于特定年份的索引列。

df <- data.frame(YEAR = c(2000,2001,2002,2000,2001,2002), 
GRP = c("A","A","A","B","B","B"),
VAL = sample(6))

我想创建一个简单的变量 VAL 索引,即值除以基准年的值,比如 2000:
df$VAL.IND <- df$VAL/df$VAL[df$YEAR == 2000]

这是不对的,因为它不尊重分组变量 GRP。我试过 plyr 但我无法让它工作。

在我的实际问题中,我有几个具有不同时间序列的分组变量,因此我正在寻找一个非常通用的解决方案。

最佳答案

我们可以在分组变量 ('GRP') 内进行计算后创建 'VAL.IND'。这可以通过多种方式完成。

一种选择是 data.table我们从“data.frame”( setDT(df) )创建“data.table”,按“GRP”分组,我们将“VAL”除以“VAL”,对应于“YEAR”值为 2000。

 library(data.table)
setDT(df)[, VAL.IND := VAL/VAL[YEAR==2000], by = GRP]

注意: base YEAR 对结果有点困惑。在这个例子中,'A' 和 'B' GRP 都有 'YEAR' 2000。假设,如果 OP 打算使用最小的 YEAR 值(考虑到它是数字列), VAL/VAL[YEAR==2000]上面代码中可以用 VAL/VAL[which.min(YEAR)]代替.

或者你可以使用类似的代码 dplyr .我们按“GRP”分组并使用 mutate创建“VAL.IND”
 library(dplyr)
df %>%
group_by(GRP) %>%
mutate(VAL.IND = VAL/VAL[YEAR==2000])

在这里,如果我们需要更换 VAL/VAL[YEAR==2000]VAL/VAL[which.min(YEAR)]
一个 base R选项与 split/unsplit .我们 split数据集按'GRP'列转换 data.framelist数据帧,循环遍历 list输出 lapply , 使用 transform 创建一个新列(或 within)并转换 list将添加的列恢复为单个 data.frame来自 unsplit .
  unsplit(lapply(split(df, df$GRP), function(x) 
transform(x, VAL.IND= VAL/VAL[YEAR==2000])), df$GRP)

请注意,我们也可以使用 do.call(rbind而不是 unsplit .但是,我更喜欢 unsplit获得与原始数据集相同的行顺序。

关于r - 将基准年索引添加到具有多个组的 R 数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31719799/

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