r-使用一列中的间隔来填充另一列的值



我有一个数据帧:

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

我想将每个ConditionTime的总长度(即,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

谢谢!

我们可以得到rangediff值(返回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"))
)

相关内容

  • 没有找到相关文章

最新更新