【问题标题】:R statistics, panel data and NAs: replacing NA value in vector with a specific row in another vector using panel dataR统计,面板数据和NA:使用面板数据将向量中的NA值替换为另一个向量中的特定行
【发布时间】:2020-05-24 10:58:11
【问题描述】:

对于一个表述不当的问题,我深表歉意。我是 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

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

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*

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

一切顺利, 托尼

【问题讨论】:

  • 听起来您最终对给定 d.stake 组合之间的差异感兴趣 id - 对吗?考虑到不同的cat 数字,您能否阐明在这种情况下您的最终/所需数据框会是什么样子?您是否希望diff2-3 之类的列名反映第二个和第三个cat 之间的差异(独立于cat 数字),还是cat 2 和cat 3 之间的差异?
  • 没错。目的是分析不同情况下的赌博行为。但是,由于个人在 3 个地点赌博,我需要考虑到观察结果嵌套在个人内部。我想要一个名为 diff1 的列(长格式)。但是,考虑到您的建议,我还希望有一个分类列明确说明比较的猫类别(cat2vscat1;cat3vs1;cat4vs1;cat3vs2;cat4vs2;cat4vs3)。那可能吗?谢谢!!

标签: r dataframe replace na panel-data


【解决方案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)
)

【讨论】:

  • 可爱!看来您已经解决了问题!谢谢本和欢呼:)
猜你喜欢
  • 2018-03-29
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
  • 2021-07-29
  • 1970-01-01
  • 2012-11-10
  • 1970-01-01
  • 2017-08-11
相关资源
最近更新 更多