根据之前的外观,在R中填写缺失的值

根据之前的外观,在R中填写缺失的值,r,dataframe,data.table,R,Dataframe,Data.table,我有以下数据: set.seed(112) round<-rep(1:5,4) player<-rep(1:2, c(10,10)) game<-rep(rep(1:2,c(5,5)),2) age<-rep(NA,20) age[1]<-26 age[11]<-32 gender<-rep(NA,20) gender[1]<-"M" gender[11]<-"F" gamematrix<-cbi

我有以下数据:

set.seed(112)
round<-rep(1:5,4)
player<-rep(1:2, c(10,10))
game<-rep(rep(1:2,c(5,5)),2)
age<-rep(NA,20)
age[1]<-26
age[11]<-32
gender<-rep(NA,20)
gender[1]<-"M"
gender[11]<-"F"
gamematrix<-cbind(player,game,round,age,gender)
gamematrix<-data.frame(gamematrix)

   player game round decs  age gender
1       1    1     1    2   26      M
2       1    1     2    3 <NA>   <NA>
3       1    1     3    3 <NA>   <NA>
4       1    1     4    3 <NA>   <NA>
5       1    1     5    1 <NA>   <NA>
6       1    2     1    1 <NA>   <NA>
7       1    2     2    1 <NA>   <NA>
8       1    2     3    3 <NA>   <NA>
9       1    2     4    1 <NA>   <NA>
10      1    2     5    2 <NA>   <NA>
11      2    1     1    1   32      F
12      2    1     2    2 <NA>   <NA>
13      2    1     3    3 <NA>   <NA>
14      2    1     4    2 <NA>   <NA>
15      2    1     5    3 <NA>   <NA>
16      2    2     1    3 <NA>   <NA>
17      2    2     2    2 <NA>   <NA>
18      2    2     3    2 <NA>   <NA>
19      2    2     4    3 <NA>   <NA>
20      2    2     5    2 <NA>   <NA>

我知道如何使用“for”函数,但我正在寻找一个更优雅的解决方案。我认为应该有一种使用“dplyr”的方法,但我无法生成它。有什么想法吗?

我建议下一步
tidyverse
方法使用
fill()
函数:

library(tidyverse)
set.seed(112)
#Data
round<-rep(1:5,4)
player<-rep(1:2, c(10,10))
game<-rep(rep(1:2,c(5,5)),2)
age<-rep(NA,20)
age[1]<-26
age[11]<-32
gender<-rep(NA,20)
gender[1]<-"M"
gender[11]<-"F"
gamematrix<-cbind(player,game,round,age,gender)
gamematrix<-data.frame(gamematrix)
#Now fill
gamematrix %>% group_by(player) %>% fill(age) %>% fill(gender)

另外,
gamematrix%>%group\U by(玩家)%>%fill(c(年龄、性别))
有助于避免多次使用同一函数产生相同的结果。

请参见数据表中的
?nafill
。谢谢!!如果每个参与者在最后一行出现“年龄”(即最后一轮(而不是第一轮)时,相同的函数是否有帮助?@YefR在这种情况下,您必须使用
fill(年龄,.direction='up')
library(tidyverse)
set.seed(112)
#Data
round<-rep(1:5,4)
player<-rep(1:2, c(10,10))
game<-rep(rep(1:2,c(5,5)),2)
age<-rep(NA,20)
age[1]<-26
age[11]<-32
gender<-rep(NA,20)
gender[1]<-"M"
gender[11]<-"F"
gamematrix<-cbind(player,game,round,age,gender)
gamematrix<-data.frame(gamematrix)
#Now fill
gamematrix %>% group_by(player) %>% fill(age) %>% fill(gender)
player game round age gender
1       1    1     1  26      M
2       1    1     2  26      M
3       1    1     3  26      M
4       1    1     4  26      M
5       1    1     5  26      M
6       1    2     1  26      M
7       1    2     2  26      M
8       1    2     3  26      M
9       1    2     4  26      M
10      1    2     5  26      M
11      2    1     1  32      F
12      2    1     2  32      F
13      2    1     3  32      F
14      2    1     4  32      F
15      2    1     5  32      F
16      2    2     1  32      F
17      2    2     2  32      F
18      2    2     3  32      F
19      2    2     4  32      F
20      2    2     5  32      F