0

我正在尝试确定 data.frame 中变量的延迟,该变量包含多个位置,在这些位置中,相关数据在一系列“开始”和“停止”标记之间列出。

为此,我需要创建一个新列,该列在每次试验开始时从 0 开始计数,并以毫秒为单位进行计数,直到试验停止或下一次试验开始(以更容易者为准,我假设后者。)

我有这个:

df <- data.frame(c(0, 32, 32, 32, 32, 31, 31, 29),  c(0, 32, 64, 96, 128, 159, 190, 219), c("Start", NA_character_, NA_character_, "Stop", NA_character_, NA_character_, "Start", NA_character_))
colnames(df) <- c('Delta', 'TimeMs', 'Marker')

我想做这个:

df <- data.frame(c(0, 32, 32, 32, 32, 31, 31, 29),  c(0, 32, 64, 96, 128, 159, 190, 119), c("Start", NA_character_, NA_character_, "Stop", NA_character_, NA_character_, "Start", NA_character_), c(0, 32, 64, 96, 128, 159, 190, 0))
colnames(df) <- c('Delta', 'TimeMs', 'Marker', 'Latency')

显然,我会创建一个新列,其中填充自动生成的 NA:

df$Latency <- NA

然后我想我会在 Stat 位置所在的新列 0 中标记:

df$Latency [which(df$Marker == 'Start')] <- 0

从那里我被困住了。我以为我可以以某种方式使用 which 命令,但我的基本 R 技能使我相信这种方法过于简化,因此不正确。

提前感谢您的帮助,如果您需要澄清,请询问!

编辑:固定示例,标题

编辑2:固定示例

编辑3:使用真实NA_character_

4

1 回答 1

1

这似乎有效

df <- data.frame(Delta=c(0, 32, 32, 32, 32, 31, 31, 29),  
                 TimeMS=c(0, 32, 64, 96, 128, 159, 190, 219), 
                 Marker=c("Start", "NA", "NA", "Stop", "NA", "NA", "Start", "NA"))

df$group   <- cumsum(df$Marker=="Start" & !is.na(df$Marker))
df$Latency <- unlist(aggregate(TimeMS~group,df,function(x)cumsum(c(0,diff(x))))$TimeMS)
df[,"group"] <- NULL
df
#   Delta TimeMS Marker Latency
# 1     0      0  Start       0
# 2    32     32     NA      32
# 3    32     64     NA      64
# 4    32     96   Stop      96
# 5    32    128     NA     128
# 6    31    159     NA     159
# 7    31    190  Start       0
# 8    29    219     NA      29

首先,我们添加一列,df$group每次递增 1 df$Marker=="Start"(因此,df$group=1对于 1:6 行,对于 7:8 行,=2)。然后我们使用该函数TimeMS按组聚合。diff(...)应用于长度为 ndiff(...)的向量,返回长度为 n-1 的向量,其中包含给定行与前一行之间的差异。所以我们需要在这个向量的开头插入一个0。aggregate(...)返回两组向量(一组用于group==1,一组用于group==2),因此我们需要unlist(...)在绑定到df. 最后一行只是删除df$group

于 2014-03-18T19:52:57.560 回答