如何通过参与者使用tidyverse将第一行中的值应用于所有后续行

如何通过参与者使用tidyverse将第一行中的值应用于所有后续行,r,tidyverse,R,Tidyverse,比如说,我们进行了一项研究,参与者在某个结果变量上进行了四次测量。在测试开始时,他们提供他们的年龄和性别。下面是一些玩具数据来说明 set.seed(1) sex <- NA age <- NA df <- data.frame(id = factor(rep(1:4,each=4)), time = rep(1:4,times=4), sex = as.vector(sapply(0:3, function(

比如说,我们进行了一项研究,参与者在某个结果变量上进行了四次测量。在测试开始时,他们提供他们的年龄和性别。下面是一些玩具数据来说明

set.seed(1)
sex <- NA
age <- NA
df <- data.frame(id = factor(rep(1:4,each=4)),
                 time = rep(1:4,times=4),
                 sex = as.vector(sapply(0:3, function(i) sex[i*4 + 1:4] <- c(sample(c("m", "f"), 1, replace = T), rep(NA,3)))),
                 age = as.vector(sapply(0:3, function(i) age[i*4 + 1:4] <- c(sample(18:75, 1, replace = T), rep(NA,3)))),
                 outcome = round(rnorm(16),2),
                 stringsAsFactors = F)
这就产生了输出

# A tibble: 16 x 6
# Groups:   id [4]
#    sex.x id     time sex.y   age outcome
#    <chr> <fct> <int> <chr> <int>   <dbl>
#  1 m     1         1 m        29   0.33 
#  2 m     1         2 NA       NA  -0.82 
#  3 m     1         3 NA       NA   0.49 
#  4 m     1         4 NA       NA   0.74 
#  5 m     2         1 m        70   0.580
#  6 m     2         2 NA       NA  -0.31 
#  7 m     2         3 NA       NA   1.51 
#  8 m     2         4 NA       NA   0.39 
#  9 f     3         1 f        72  -0.62 
# 10 f     3         2 NA       NA  -2.21 
# 11 f     3         3 NA       NA   1.12 
# 12 f     3         4 NA       NA  -0.04 
# 13 f     4         1 f        56  -0.02 
# 14 f     4         2 NA       NA   0.94 
# 15 f     4         3 NA       NA   0.82 
# 16 f     4         4 NA       NA   0.59 
#一个tible:16 x 6
#组别:id[4]
#性别.x id时间性别.y年龄结果
#           
#1米1米29 0.33
#2米1 2钠钠-0.82
#3m13na0.49
#4m14na0.74
#5米2 1米70 0.580
#6m2 NA-0.31
#7米2 3纳纳1.51
#8米2 4钠钠0.39
#9楼3楼1楼72-0.62
#10 f 3 2 NA-2.21
#11 f 3 NA NA 1.12
#12 f 3 4 NA NA-0.04
#13 f 4 1 f 56-0.02
#14 f 4 2 NA 0.94
#15 f 4 3 NA 0.82
#16 f 4 NA NA 0.59

现在我认为这是部分成功的,因为每个参与者的<>代码>性别.x/Cudio>列已经应用到所有其他行,但是我真的不喜欢现在有两个性别列。 现在,我可以轻松地向链中添加更多函数,删除多余的

sex.y
列,并将
sex.x
列重命名为其原始形式,但这似乎有点笨拙


有人能建议如何做得更好吗?

您可以
填写每个
id的
性别
值:

library(dplyr)
df %>% group_by(id) %>% tidyr::fill(sex)

#   id     time sex     age outcome
#   <fct> <int> <chr> <int>   <dbl>
# 1 1         1 m        51  -1.54 
# 2 1         2 m        NA  -0.93 
# 3 1         3 m        NA  -0.290
# 4 1         4 m        NA  -0.01 
# 5 2         1 f        40   2.4  
# 6 2         2 f        NA   0.76 
# 7 2         3 f        NA  -0.8  
# 8 2         4 f        NA  -1.15 
# 9 3         1 m        60  -0.290
#10 3         2 m        NA  -0.3  
#11 3         3 m        NA  -0.41 
#12 3         4 m        NA   0.25 
#13 4         1 m        31  -0.89 
#14 4         2 m        NA   0.44 
#15 4         3 m        NA  -1.24 
#16 4         4 m        NA  -0.22 
库(dplyr)
df%>%分组依据(id)%>%tidyr::填充(性别)
#id时间性别年龄结果
#         
#1米51-1.54
#2 1 2米钠-0.93
#3 1 3米钠-0.290
#414米钠-0.01
#5 2 1 f 40 2.4
#6 2 f NA 0.76
#7 2 3 f NA-0.8
#8 2 4 f NA-1.15
#9 3 1米60-0.290
#1032MNA-0.3
#11.3米钠-0.41
#12 3 4米钠0.25
#13 4 1米31-0.89
#14 4 2米钠0.44
#15 4 3米钠-1.24
#16.4米钠-0.22
您还可以
fill
age
value。(
df%>%groupby(id)%%>%tidyr::fill(性别、年龄)


PS-我从相同的种子值中得到不同的数字。

您可以
为每个
id
填充
性别
值:

library(dplyr)
df %>% group_by(id) %>% tidyr::fill(sex)

#   id     time sex     age outcome
#   <fct> <int> <chr> <int>   <dbl>
# 1 1         1 m        51  -1.54 
# 2 1         2 m        NA  -0.93 
# 3 1         3 m        NA  -0.290
# 4 1         4 m        NA  -0.01 
# 5 2         1 f        40   2.4  
# 6 2         2 f        NA   0.76 
# 7 2         3 f        NA  -0.8  
# 8 2         4 f        NA  -1.15 
# 9 3         1 m        60  -0.290
#10 3         2 m        NA  -0.3  
#11 3         3 m        NA  -0.41 
#12 3         4 m        NA   0.25 
#13 4         1 m        31  -0.89 
#14 4         2 m        NA   0.44 
#15 4         3 m        NA  -1.24 
#16 4         4 m        NA  -0.22 
库(dplyr)
df%>%分组依据(id)%>%tidyr::填充(性别)
#id时间性别年龄结果
#         
#1米51-1.54
#2 1 2米钠-0.93
#3 1 3米钠-0.290
#414米钠-0.01
#5 2 1 f 40 2.4
#6 2 f NA 0.76
#7 2 3 f NA-0.8
#8 2 4 f NA-1.15
#9 3 1米60-0.290
#1032MNA-0.3
#11.3米钠-0.41
#12 3 4米钠0.25
#13 4 1米31-0.89
#14 4 2米钠0.44
#15 4 3米钠-1.24
#16.4米钠-0.22
您还可以
fill
age
value。(
df%>%groupby(id)%%>%tidyr::fill(性别、年龄)


PS-我从同一种子值中得到不同的数字。

这是否回答了您的问题。这是一个更好的骗局:。是的,第二个骗局以相同的方式回答了相同的问题。可能您的前一步需要重新进行。数据是如何生成的?如果您的数据分为两个数据帧(一个用于基线数据,一个用于后续数据),将它们合并在一起将为您提供所需的输出,而无需填写任何内容。遗憾的是@Edward,它们都是从redcap数据库提取的同一部分。毫无疑问,我本可以单独提取数据集并以这种方式完成。这个问题比其他任何问题都更能启发我。这回答了你的问题吗。这是一个更好的骗局:。是的,第二个骗局以相同的方式回答了相同的问题。可能您的前一步需要重新进行。数据是如何生成的?如果您的数据分为两个数据帧(一个用于基线数据,一个用于后续数据),将它们合并在一起将为您提供所需的输出,而无需填写任何内容。遗憾的是@Edward,它们都是从redcap数据库提取的同一部分。毫无疑问,我本可以单独提取数据集并以这种方式完成。这个问题更多的是对我的教诲,谢谢你,Ronak Shah,很简单。我知道这个问题必须有一个动词。谢谢@Ronak Shah,很简单。我知道这个问题必须有一个动词。
library(dplyr)
df %>% group_by(id) %>% tidyr::fill(sex)

#   id     time sex     age outcome
#   <fct> <int> <chr> <int>   <dbl>
# 1 1         1 m        51  -1.54 
# 2 1         2 m        NA  -0.93 
# 3 1         3 m        NA  -0.290
# 4 1         4 m        NA  -0.01 
# 5 2         1 f        40   2.4  
# 6 2         2 f        NA   0.76 
# 7 2         3 f        NA  -0.8  
# 8 2         4 f        NA  -1.15 
# 9 3         1 m        60  -0.290
#10 3         2 m        NA  -0.3  
#11 3         3 m        NA  -0.41 
#12 3         4 m        NA   0.25 
#13 4         1 m        31  -0.89 
#14 4         2 m        NA   0.44 
#15 4         3 m        NA  -1.24 
#16 4         4 m        NA  -0.22