R 统计数据、面板数据和 NA:使用面板数据将向量中的 NA 值替换为另一个向量中的特定行

R statistics, panel data and NAs: replacing NA value in vector with a specific row in another vector using panel data

对于一个表述不当的问题,我深表歉意。我不熟悉 R 和编程以及发布问题。

我正在处理面板数据。我有两个上下文变量:cat(范围从 1 到 4 的类别,其中个人在 4 个可能的地方中的 3 个赌博)和 d.stake = 在给定类别中下注的金额。 Cat 和 d.stake 嵌套在个体 (id)(上下文独立变量)中。

我希望在不同类别的不同类别中获得不同的分数。

我创建了四个变量。其中两个lag是一个滞后变量(ldstake和ldstake2)和两个差分变量(diff1 = stake - ldstake;diff2 stake - ldstake2),使用代码

df.3$ldstake <- c(NA, df.3$d.stake[-nrow(df.3)])
df.3$ldstake[which(!duplicated(df.3$id))] <- NA


df.3$ldstake2 <- c(NA, df.3$ldstake[-nrow(df.3)])
df.3$ldstake2[which(!duplicated(df.3$id))] <- NA


df.3 <- df.3 %>%
 mutate(diff1 = d.stake - ldstake,
     diff2 = d.stake - ldstake2)

这给了我以下数据框:

id cat d.stake ldstake ldstake2 diff1 diff2
1   1    50      NA       NA     NA     NA
1   2    60      50       NA     10     NA
1   3    55      60       50     -5     5
2   1    34      NA       NA     NA     NA
2   2    74      34       NA     40     NA
2   4    12      74       34     -62    22

但是,我希望将每个人的 diff1(NA)的第一行替换为每个人的 diff2 的第三行(参见下面的示例)。

id cat d.stake ldstake ldstake2 diff1 diff2
1   1    50      NA       NA     !5!    NA
1   2    60      50       NA     10     NA
1   3    55      60       50     -5     !5!
2   1    34      NA       NA    *22*    NA
2   2    74      34       NA     40     NA
2   4    12      74       34    -62    *22*

这可能吗?我将很高兴收到一个脚本,我可以在其中将第一个 NA 值替换为 diff2 的值和个人的最后一个值(第三次或最后一次观察)。此外,如果有一个脚本可以自动执行此操作(即在 cat2-1 cat3-2 和 cat3-1 之间创建差异分数),我将不胜感激。

一切顺利, 托尼

这是一种基于我上周一直在做的其他事情的可能性。

library(tidyverse)

df_wide <- df %>%
  pivot_wider(id_cols = id, names_from = cat, values_from = d.stake) %>%
  as.data.frame(.)

data.frame(id = df_wide$id, combn(df_wide[-1], 2, function(x) x[,1]-x[,2])) %>%
  setNames(c("id", apply(combn(names(df_wide[-1]), 2), 2, paste0, collapse = "-"))) %>%
  pivot_longer(cols = -id, names_to = "cats", values_to = "diff") %>%
  drop_na()

输出

# A tibble: 6 x 3
     id cats   diff
  <dbl> <chr> <dbl>
1     1 1-2     -10
2     1 1-3      -5
3     1 2-3       5
4     2 1-2     -40
5     2 1-4      22
6     2 2-4      62

数据

df <- data.frame(
  id = c(1,1,1,2,2,2),
  cat = c(1,2,3,1,2,4),
  d.stake = c(50,60,55,34,74,12)
)