如何通过参与者使用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