【问题标题】:Variance over time with two dataframes in RR中两个数据帧随时间的变化
【发布时间】:2020-05-16 12:42:46
【问题描述】:

我有两个数据框。 df1 是一个数据框,其中每一行都是某人给出的分数。

df1

title <- c("x","x","x","x","y","y","y","y","y")
day <- c(0,2,2,4,1,1,3,3,4)
score <- c(7,7,6,4,8,1,7,1,5)
df1 = data.frame(title,day,score)

df2 是长格式的标题日格式面板数据集,具有很多变量。我正在寻找一种方法来改变第 x 天的方差得分和随时间变化的方差得分(即第 x 天的得分方差和所有以前的得分)。

应该是这样的:

title <- c("x","x","x","x","x","y","y","y","y","y")
day <- c(0,1,2,3,4,0,1,2,3,4)
variance_day_x <- c(0,0,0.5,0,0,0,24.5,0,12,0)
variance_cumulative <- c(0,0,0.3333,0.3333,2,0,24.5,24.5,14.25,10.8)
df2 <- data.frame(title,day,variance_day_x,variance_cumulative)

如您所见,我需要将 df1 中的 2 个变量变异为 df2。每天的方差是第一个变量,当当天有 0 或 1 分可用时,方差 = 0,因为没有什么可计算的。第二个变量是累积方差,每次有新分数可用时都需要更新方差。

希望这能很好地解释我的问题。我现在卡住了,希望你们能帮忙!

【问题讨论】:

  • 你能添加预期的输出吗?
  • 我已经做到了。见 df2。

标签: r variance panel-data


【解决方案1】:

使用tidyverse 你可以尝试这样的事情。首先group_bytitle 并使用可以从mutate 调用的自定义累积方差函数。每日方差是在按titleday 分组后计算的。 complete 将填写缺失天数,fill 将结转这些缺失天数的累积方差。如果您愿意,可以将NA 替换为零replace_na

library(tidyverse)

cumvar <- function(x)  {
  sapply(seq_along(x), function(i) var(x[1:i]))
}

df1 %>%
  group_by(title) %>%
  mutate(cvar = cumvar(score)) %>%
  group_by(title, day) %>%
  summarise(variance_day_x = var(score),
            variance_cumulative = last(cvar)) %>%
  complete(title, day = 0:4) %>%
  fill(variance_cumulative, .direction = "down")

输出

# A tibble: 10 x 4
# Groups:   title [2]
   title   day variance_day_x variance_cumulative
   <chr> <dbl>          <dbl>               <dbl>
 1 x         0           NA                NA    
 2 x         1           NA                NA    
 3 x         2            0.5               0.333
 4 x         3           NA                 0.333
 5 x         4           NA                 2    
 6 y         0           NA                NA    
 7 y         1           24.5              24.5  
 8 y         2           NA                24.5  
 9 y         3           18                14.2  
10 y         4           NA                10.8

【讨论】:

  • 真的很喜欢这个简单的解决方案。谢谢本!
【解决方案2】:

有点凌乱的Base R解决方案:

df_variances <- cbind(df1,  data.frame(do.call("rbind", lapply(split(df1, df1$title),
       function(x){
        variance_cumulative <- sapply(seq_len(nrow(x)), function(i){
          z <- var(x$score[1:i]) 
          }
        )
        variance_day_x <- sapply(seq_len(nrow(x)), function(j){
          q <- var(x$score[(j-1):j])
          }
        )
       variance_df <- data.frame(variance_day_x = variance_day_x,
                                 variance_cumulative = variance_cumulative)
    }
  )
), row.names =  NULL))

df_clean <- replace(df_variances, is.na(df_variances), 0)

【讨论】:

    【解决方案3】:

    另一种基础 R 解决方案。我还使用了自定义 cumvar 函数。此外,我使用@Ruben's great repeat_last function 用最后一个已知值填充NAs。

    此解决方案主要基于ave,它将函数应用于按其他变量分组的变量。由于天数不完整,我们可以将merge 原始数据转换为包含所有unique 标题和天数的完整数据集。在计算variances 之前,我们计算累积方差;这个想法是稍后使用length 每天选择“较新”的值。最后我们删除dupes,就完成了。

    cumvar <- function(x) sapply(1:length(x), function(i) {var(x[1:i])})
    df1$vari.cum <- with(df1, ave(score, title, FUN=cumvar))
    compl <- expand.grid(title=unique(df1$title), day=unique(df1$day))
    dfx <- merge(compl, df1, all.x= TRUE)
    dfx$vari.cum <- with(dfx, ave(vari.cum, title, FUN=repeat_last))
    res <- within(dfx, {
      vari.day <- ave(score, title, day, FUN=var)
      vari.cum <- ave(vari.cum, title, day, FUN=function(x) x[length(x)])
    })
    res <- res[!duplicated(res[c("title", "day")]), c(1:2, 5:4)]
    res
    #   title day vari.day   vari.cum
    # 1      x   0       NA         NA
    # 2      x   1       NA         NA
    # 3      x   2      0.5  0.3333333
    # 5      x   3       NA  0.3333333
    # 6      x   4       NA  2.0000000
    # 7      y   0       NA         NA
    # 8      y   1     24.5 24.5000000
    # 10     y   2       NA 24.5000000
    # 11     y   3     18.0 14.2500000
    # 13     y   4       NA 10.8000000
    

    【讨论】:

      猜你喜欢
      • 2011-03-26
      • 2020-01-09
      • 2018-03-25
      • 2017-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-10
      • 2021-02-06
      相关资源
      最近更新 更多