Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何基于单独列中的开始-停止信息创建值_R_Dataframe_Dplyr_Tidyr - Fatal编程技术网

R 如何基于单独列中的开始-停止信息创建值

R 如何基于单独列中的开始-停止信息创建值,r,dataframe,dplyr,tidyr,R,Dataframe,Dplyr,Tidyr,我有一个由研究设备创建的非常混乱的数据集。该数据显示每隔几毫秒(“时间”)的生理测量(“生理”)。输出列出了几个用户消息,例如试验开始时(“开始试验”),试验结束时(“停止试验”),以及研究人员可能感兴趣的其他随机事件。有时“START_TRIAL n”消息会连续重复,有时在没有消息时,会在空白单元格中留下一个简单的“0” 我希望创建一个新的专栏,指出当前案件属于哪个审判。(参见下面的示例数据) 有没有一种方法可以通过dplyr和突变来实现这一点?我想知道我是否需要做一个if-then语句来更改

我有一个由研究设备创建的非常混乱的数据集。该数据显示每隔几毫秒(“时间”)的生理测量(“生理”)。输出列出了几个用户消息,例如试验开始时(“开始试验”),试验结束时(“停止试验”),以及研究人员可能感兴趣的其他随机事件。有时“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"))