Sci*_*ens 4 r transformation panel hierarchical-data dplyr
我想创建一个新变量,指示对变量值的第一次特定观察.
在下面的示例数据集中,我希望有一个新变量"firstna",对于此玩家的第一次观察"NA",该变量为"1".
game_data <- data.frame(player = c(1,1,1,1,2,2,2,2), level = c(1,2,3,4,1,2,3,4), points = c(20,NA,NA,NA,20,40,NA,NA))
game_data
player level points
1 1 1 20
2 1 2 NA
3 1 3 NA
4 1 4 NA
5 2 1 20
6 2 2 40
7 2 3 NA
8 2 4 NA
Run Code Online (Sandbox Code Playgroud)
生成的数据框应如下所示:
game_data_new <- data.frame(player = c(1,1,1,1,2,2,2,2), level = c(1,2,3,4,1,2,3,4), points = c(20,NA,NA,NA,20,40,NA,NA), firstna = c(0,1,0,0,0,0,1,0))
game_data_new
player level points firstna
1 1 1 20 0
2 1 2 NA 1
3 1 3 NA 0
4 1 4 NA 0
5 2 1 20 0
6 2 2 40 0
7 2 3 NA 1
8 2 4 NA 0
Run Code Online (Sandbox Code Playgroud)
说实话,我不知道该怎么做.如果有dplyr选项,这将是完美的.
基础R解决方案:
ave(game_data$points, game_data$player,
FUN = function(x) seq_along(x) == match(NA, x, nomatch = 0))
Run Code Online (Sandbox Code Playgroud)
ave首先NA通过group(player)查找的另一个选项.
game_data$firstna <- ave(game_data$points, game_data$player,
FUN = function(x) cumsum(is.na(x)) == 1)
game_data
# player level points firstna
#1 1 1 20 0
#2 1 2 NA 1
#3 1 3 NA 0
#4 1 4 NA 0
#5 2 1 20 0
#6 2 2 40 0
#7 2 3 NA 1
#8 2 4 NA 0
Run Code Online (Sandbox Code Playgroud)