R 如何基于单独列中的开始-停止信息创建值
我有一个由研究设备创建的非常混乱的数据集。该数据显示每隔几毫秒(“时间”)的生理测量(“生理”)。输出列出了几个用户消息,例如试验开始时(“开始试验”),试验结束时(“停止试验”),以及研究人员可能感兴趣的其他随机事件。有时“START_TRIAL n”消息会连续重复,有时在没有消息时,会在空白单元格中留下一个简单的“0” 我希望创建一个新的专栏,指出当前案件属于哪个审判。(参见下面的示例数据) 有没有一种方法可以通过dplyr和突变来实现这一点?我想知道我是否需要做一个if-then语句来更改每种情况下新列的值,但肯定有更优雅的解决方案吗?(提前感谢您帮助这个新手!) 进入R 如何基于单独列中的开始-停止信息创建值,r,dataframe,dplyr,tidyr,R,Dataframe,Dplyr,Tidyr,我有一个由研究设备创建的非常混乱的数据集。该数据显示每隔几毫秒(“时间”)的生理测量(“生理”)。输出列出了几个用户消息,例如试验开始时(“开始试验”),试验结束时(“停止试验”),以及研究人员可能感兴趣的其他随机事件。有时“START_TRIAL n”消息会连续重复,有时在没有消息时,会在空白单元格中留下一个简单的“0” 我希望创建一个新的专栏,指出当前案件属于哪个审判。(参见下面的示例数据) 有没有一种方法可以通过dplyr和突变来实现这一点?我想知道我是否需要做一个if-then语句来更改
一种选择是用
grep
识别“开始试验”,进行匹配
以获得索引,并用先前的非NA相邻元素填充NA元素
library(dplyr)
library(tidyr)
df1 %>%
mutate(Trial = match(PhysioCond, unique(grep("START_TRIAL",
PhysioCond, value = TRUE)))) %>%
fill(Trial)
# Time PhysioCond Trial
#1 34 START_TRIAL 1 1
#2 33 0 1
#3 25 RANDOM_MSG 1
#4 43 STOP_TRIAL 1
#5 27 START_TRIAL 2 2
#6 54 START_TRIAL 2 2
#7 32 0 2
#8 54 RANDOM_MSG 2
#9 23 STOP_TRIAL 2
注意:不清楚列名,但逻辑应该工作正常
数据
df1@akrun我喜欢你的答案,因为你的答案太棒了!!!谢谢
Time Physio Trial Cond
1 34 1 START_TRIAL 1
2 33 1 0
3 25 1 RANDOM_MSG
4 43 1 STOP_TRIAL
5 27 2 START_TRIAL 2
6 54 2 START_TRIAL 2
7 32 2 0
8 54 2 RANDOM_MSG
9 23 2 STOP_TRIAL
structure(list(Time = 1:9, Physio = c(34L, 33L, 25L, 43L, 27L,
54L, 32L, 54L, 23L), Trial = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L,
2L), Cond = structure(c(4L, 2L, 3L, 6L, 5L, 5L, 2L, 3L, 6L), .Label = c("",
"0", "RANDOM_MSG", "START_TRIAL 1", "START_TRIAL 2", "STOP_TRIAL"
), class = "factor")), .Names = c("Time", "Physio", "Trial",
"Cond"), row.names = c(NA, 9L), class = "data.frame")
library(dplyr)
library(tidyr)
df1 %>%
mutate(Trial = match(PhysioCond, unique(grep("START_TRIAL",
PhysioCond, value = TRUE)))) %>%
fill(Trial)
# Time PhysioCond Trial
#1 34 START_TRIAL 1 1
#2 33 0 1
#3 25 RANDOM_MSG 1
#4 43 STOP_TRIAL 1
#5 27 START_TRIAL 2 2
#6 54 START_TRIAL 2 2
#7 32 0 2
#8 54 RANDOM_MSG 2
#9 23 STOP_TRIAL 2
df1 <- structure(list(Time = c(34L, 33L, 25L, 43L, 27L, 54L, 32L, 54L,
23L), PhysioCond = c("START_TRIAL 1", "0", "RANDOM_MSG", "STOP_TRIAL",
"START_TRIAL 2", "START_TRIAL 2", "0", "RANDOM_MSG", "STOP_TRIAL"
)), class = "data.frame", row.names = c("1", "2", "3", "4", "5",
"6", "7", "8", "9"))