如何根据R中不同数据帧的条件创建新变量
How to create a new variable based on condition from different dataframe in R
我有 2 个来自实验的数据框。第一个 df 在 40 分钟内读取(大致)连续信号。有 5 列,1:3 是二进制的 - 表示是否按下了按钮。第 4 列是第 2 列或第 3 列是否被推送的二进制。第 5 列是以秒为单位的近似时间。下面的 df 示例:
initiate
left
right
l or r
time
0
0
1
1
2.8225
0
0
1
1
2.82375
0
0
1
1
2.82500
0
0
1
1
2.82625
1
0
0
0
16.82000
1
0
0
0
16.82125
等等
第二个数据框是会话信息,其中每一行都是一次试验,通常有 100-150 行,具体取决于一天。我有一列标记试用开始时间,另一列标记试用结束时间(以秒为单位)。下面 df 的示例(我省略了几个不相关的列):
trial
success
t start
t end
1
0
16.64709
35.49431
2
1
41.81843
57.74304
3
0
65.54510
71.16612
4
0
82.65743
87.30914
等等
对于第一个数据框,我想创建一个列来指示按钮是否在试验中被按下。这是基于那些开始和结束时间第二个df。我希望它看起来像这样(iti = inter-trial,wt = within trial):
initiate
left
right
l or r
time
trial
0
0
1
1
2.8225
iti
0
0
1
1
2.82375
iti
0
0
1
1
2.82500
iti
0
0
1
1
2.82625
iti
1
0
0
0
16.82000
wt
1
0
0
0
16.82125
wt
等等
我想做这样的事情,但我在 2 个数据帧之间没有分组变量,所以它不起作用:
df2 %>%
full_join(df1, by = "trial") %>%
mutate(in_iti = case_when(time < tstart & time > tend ~ "iti",
time > tstart & time < tend ~ "within_trial"))
关于如何根据 df2 的时间条件标记 df1 中的行有什么想法吗?
谢谢!
也许可以试试下面的方法,如果你的数据比较小,用dplyr
。假设 df
和 df2
的 data.frames 的名称。使用 mutate
创建新列,并 ifelse
将第一个 data.frame 中的每个 time
与第二个 [=] 中的 t_start
和 t_end
进行比较27=].
library(dplyr)
df %>%
rowwise() %>%
mutate(trial = ifelse(any(time > df2$t_start & time < df2$t_end), "wt", "iti"))
输出
initiate left right l_or_r time trial
<int> <int> <int> <int> <dbl> <chr>
1 0 0 1 1 2.82 iti
2 0 0 1 1 2.82 iti
3 0 0 1 1 2.82 iti
4 0 0 1 1 2.83 iti
5 1 0 0 0 16.8 wt
6 1 0 0 0 16.8 wt
我有 2 个来自实验的数据框。第一个 df 在 40 分钟内读取(大致)连续信号。有 5 列,1:3 是二进制的 - 表示是否按下了按钮。第 4 列是第 2 列或第 3 列是否被推送的二进制。第 5 列是以秒为单位的近似时间。下面的 df 示例:
initiate | left | right | l or r | time |
---|---|---|---|---|
0 | 0 | 1 | 1 | 2.8225 |
0 | 0 | 1 | 1 | 2.82375 |
0 | 0 | 1 | 1 | 2.82500 |
0 | 0 | 1 | 1 | 2.82625 |
1 | 0 | 0 | 0 | 16.82000 |
1 | 0 | 0 | 0 | 16.82125 |
等等
第二个数据框是会话信息,其中每一行都是一次试验,通常有 100-150 行,具体取决于一天。我有一列标记试用开始时间,另一列标记试用结束时间(以秒为单位)。下面 df 的示例(我省略了几个不相关的列):
trial | success | t start | t end |
---|---|---|---|
1 | 0 | 16.64709 | 35.49431 |
2 | 1 | 41.81843 | 57.74304 |
3 | 0 | 65.54510 | 71.16612 |
4 | 0 | 82.65743 | 87.30914 |
等等
对于第一个数据框,我想创建一个列来指示按钮是否在试验中被按下。这是基于那些开始和结束时间第二个df。我希望它看起来像这样(iti = inter-trial,wt = within trial):
initiate | left | right | l or r | time | trial |
---|---|---|---|---|---|
0 | 0 | 1 | 1 | 2.8225 | iti |
0 | 0 | 1 | 1 | 2.82375 | iti |
0 | 0 | 1 | 1 | 2.82500 | iti |
0 | 0 | 1 | 1 | 2.82625 | iti |
1 | 0 | 0 | 0 | 16.82000 | wt |
1 | 0 | 0 | 0 | 16.82125 | wt |
等等
我想做这样的事情,但我在 2 个数据帧之间没有分组变量,所以它不起作用:
df2 %>%
full_join(df1, by = "trial") %>%
mutate(in_iti = case_when(time < tstart & time > tend ~ "iti",
time > tstart & time < tend ~ "within_trial"))
关于如何根据 df2 的时间条件标记 df1 中的行有什么想法吗?
谢谢!
也许可以试试下面的方法,如果你的数据比较小,用dplyr
。假设 df
和 df2
的 data.frames 的名称。使用 mutate
创建新列,并 ifelse
将第一个 data.frame 中的每个 time
与第二个 [=] 中的 t_start
和 t_end
进行比较27=].
library(dplyr)
df %>%
rowwise() %>%
mutate(trial = ifelse(any(time > df2$t_start & time < df2$t_end), "wt", "iti"))
输出
initiate left right l_or_r time trial
<int> <int> <int> <int> <dbl> <chr>
1 0 0 1 1 2.82 iti
2 0 0 1 1 2.82 iti
3 0 0 1 1 2.82 iti
4 0 0 1 1 2.83 iti
5 1 0 0 0 16.8 wt
6 1 0 0 0 16.8 wt