我想根据数据框中观察的顺序向数据框添加变量值。
… Subject Latency(s)
1 A 25
2 A 24
3 A 25
4 B 22
5 B 24
6 B 23
我想添加一个名为Trial
的第三列,我想根据观察的顺序和主题,将值设置为T1,T2或T3。因此,例如,主题A将在第1行获得T1,在第2行获得T2,在第3行获得T3。然后对于主题B获得相同的结果,依此类推。
现在我的方法是使用group_by
中的dplyr
按主题进行分组。但我不确定如何使用mutate
指定新变量。
答案 0 :(得分:1)
使用mutate
w / row_number
& group_by(Subject)
library(dplyr)
txt <- "ID Subject Latency(s)
1 A 25
2 A 24
3 A 25
4 B 22
5 B 24
6 B 23"
dat <- read.table(text = txt, header = TRUE)
dat <- dat %>%
group_by(Subject) %>%
mutate(Trial = paste0("T", row_number()))
dat
#> # A tibble: 6 x 4
#> # Groups: Subject [2]
#> ID Subject Latency.s. Trial
#> <int> <fct> <int> <chr>
#> 1 1 A 25 T1
#> 2 2 A 24 T2
#> 3 3 A 25 T3
#> 4 4 B 22 T1
#> 5 5 B 24 T2
#> 6 6 B 23 T3
由reprex package创建于2018-03-17(v0.2.0)。
答案 1 :(得分:0)
此解决方案适用于任何数量的主题。为了说明,将此代码复制并粘贴到您的控制台中。
library(dplyr)
data.frame(subject = c("A","A","A","B","B","B","C","D","D"),
latency = c(25,24,25,22,24,23,34,54,34)) -> d
# get counts of unique subjects
d %>% dplyr::count(subject) -> n
# create a list of sequences
lapply(n$n, seq) -> my_list
# paste a "T" to each of these sequences
lapply(my_list,function(x){paste0("T", x)}) -> t_list
# bind the collapsed list back onto your df
d$trial <- do.call(c, t_list)