我有一个数据帧:
dataframe <- data.frame(Condition = rep(c(1,2,3), each = 5, times = 2),
Time = sort(sample(1:60, 30)))
Condition Time
1 1 1
2 1 3
3 1 4
4 1 7
5 1 9
6 2 11
7 2 12
8 2 14
9 2 16
10 2 18
11 3 19
12 3 24
13 3 25
14 3 28
15 3 30
16 1 31
17 1 34
18 1 35
19 1 38
20 1 39
21 2 40
22 2 42
23 2 44
24 2 47
25 2 48
26 3 49
27 3 54
28 3 55
29 3 57
30 3 59
我想将每个Condition
的Time
的总长度(即,max(Time(-min(Time((除以常数"x"(例如,3(。然后我想用这个商添加一个新的变量Trial
,这样我的数据帧看起来像这样:
Condition Time Trial
1 1 1 A
2 1 3 A
3 1 4 B
4 1 7 C
5 1 9 C
6 2 11 A
7 2 12 A
8 2 14 B
9 2 16 C
10 2 18 C
... and so on
如您所见,对于条件1,Trial每隔2.67秒=8(总时间(/3填充一次唯一的识别值(例如,A、B、C(。对于条件2,每2.33秒填充一次试验=7(总时间(/3。
我没有用我当前的代码得到我想要的东西:
dataframe %>%
group_by(Condition) %>%
mutate(Trial = LETTERS[cut(Time, 3, labels = F)])
# Groups: Condition [3]
Condition Time Trial
<dbl> <int> <chr>
1 1 1 A
2 1 3 A
3 1 4 A
4 1 7 A
5 1 9 A
6 2 11 A
7 2 12 A
8 2 14 A
9 2 16 A
10 2 18 A
# ... with 20 more rows
谢谢!
我们可以得到range
的diff
值(返回min/max
作为vector
(,并除以传递到的常数,即3作为cut
中的breaks
(。然后,使用整数索引(labels = FALSE
(从LETTERS
内置的R常数中获得相应的LETTER
library(dplyr)
dataframe %>%
group_by(Condition) %>%
mutate(Trial = LETTERS[cut(Time, diff(range(Time))/3,
labels = FALSE)])
如果分组应基于"条件"中的相邻值,则在"条件"列上使用data.table
中的rleid
创建分组,并应用与上述相同的代码
library(data.table)
dataframe %>%
group_by(grp = rleid(Condition)) %>%
mutate(Trial = LETTERS[cut(Time, diff(range(Time))/3,
labels = FALSE)])
这是使用我的santoku
包的一行代码。rleid
行与@akrun的解决方案中提到的相同。
dataframe %<>%
group_by(grp = data.table::rleid(Condition)) %>%
mutate(
Trial = chop_evenly(Time, intervals = 3, labels = lbl_seq("A"))
)