我有一个非常长的数据框(超过30万行),包含一个任务的所有主题试验,采用长格式。因此,大约有300行是针对一个主题的连续试验,其次是其他主题。我想做的是创建一个新列,其中包含每个主题的试用编号。
如:
subject trial_number 101 1 101 2 101 3 102 1 102 2 102 3
我想我应该以某种方式使R从列主题中选择一个主题号,然后创建一个升序列表,然后将其循环到所有主题号上。但是我无法弄清楚如何遍历主题编号,同时又在这些主题的同一列中创建升序列表?我看到的创建新列的不同之处在于,它们全都是基于其他列中的计算或值,而对我而言,新列中的值不是基于另一列的计算或值。
我还考虑过根据主题编号将数据框拆分为较小的框,创建升序列表,然后再次合并它们?似乎是一种效率很低的方法吗?
我没有用于失败尝试的示例代码,因为我无法弄清楚如何构造它。我在想子集和内部的某种组合?还是有更好的解决方案,我的谷歌搜索技能还没有帮助我找到答案?
使用dplyr
。
library(dplyr)
dat2 <- dat %>%
group_by(subject) %>%
mutate(trial_number = 1:n()) %>%
ungroup()
dat2
# subject trial_number
# <int> <int>
# 1 101 1
# 2 101 2
# 3 101 3
# 4 102 1
# 5 102 2
# 6 102 3
要么
dat2 <- dat %>%
group_by(subject) %>%
mutate(trial_number = row_number()) %>%
ungroup()
dat2
# subject trial_number
# <int> <int>
# 1 101 1
# 2 101 2
# 3 101 3
# 4 102 1
# 5 102 2
# 6 102 3
要么 data.table
library(data.table)
setDT(dat)
dat[, trial_number := seq_len(.N), by = subject][]
subject trial_number
1: 101 1
2: 101 2
3: 101 3
4: 102 1
5: 102 2
6: 102 3
或rowid
或rowidv
中data.table
。
library(data.table)
setDT(dat)
dat[, trail_number := rowidv(dat, cols = "subject")][]
# subject trial_number
# 1: 101 1
# 2: 101 2
# 3: 101 3
# 4: 102 1
# 5: 102 2
# 6: 102 3
library(data.table)
setDT(dat)
dat[, trail_number := rowid(dat$subject)][]
# subject trial_number
# 1: 101 1
# 2: 101 2
# 3: 101 3
# 4: 102 1
# 5: 102 2
# 6: 102 3
或与基础Rtapply
和unlist
。
dat2 <- dat
dat2$trial_number <- unlist(tapply(dat$subject, dat$subject, seq_along))
dat2
# subject trial_number
# 1 101 1
# 2 101 2
# 3 101 3
# 4 102 1
# 5 102 2
# 6 102 3
dat <- read.table(text = "subject
101
101
101
102
102
102 ", header = TRUE)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句