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