【问题标题】:Create new column in dataframe that begins adding values from a column starting from a row specified by a third column在数据框中创建新列,该列开始从第三列指定的行开始的列添加值
【发布时间】:2014-03-18 18:48:46
【问题描述】:

我正在尝试确定 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

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

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

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

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

编辑:固定示例,标题

edit2:固定示例

edit3:使用真实的NA_character_

【问题讨论】:

  • 在您的示例中,df[8,]$TimeMS 应该是 219(而不是 119)吗??
  • @jlhoward 是的,感谢您指出这一点!我还编辑了第二个 df 以反映 0 也应该与第二个“开始”同时发生。

标签: r dataframe multiple-conditions


【解决方案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,每次df$Marker=="Start" 递增 1(因此,df$group=1 用于第 1:6 行,=2 用于第 7:8 行)。然后我们使用diff(...) 函数按组聚合TimeMS。应用于长度为 n 的向量,diff(...) 返回一个长度为 n-1 的向量,其中包含给定行与前一行之间的差异。所以我们需要在这个向量的开头插入一个0。 aggregate(...) 返回两组向量(一组用于group==1,一组用于group==2),因此我们需要在绑定df 之前将unlist(...) 转换为单个向量。最后一行只是删除了df$group

【讨论】:

  • 当我在真实数据集中运行第一行时,它会返回如下所示的内容:df &lt;- 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"), Group=c(1, NA, NA, NA, NA, NA, NA, NA) ) 这可能是因为我的示例使用“NA”而我的真实数据使用自动生成的 NA?
  • 我用NA_character_检查了这个例子,果然不行。新手犯的错误对不起!
  • 查看我的编辑。将df$group &lt;- ... 行更改为df$group &lt;- cumsum(df$Marker=="Start" &amp; !is.na(df$Marker))
  • @jlhowrd 完美。感谢您在我学习 R 的过程中帮助我。注意从现在开始第一次使用 NA_character_!is.na
  • 您可以只使用NA(不带引号)。 R 认为这是一个特殊的常数。
猜你喜欢
  • 2020-11-03
  • 1970-01-01
  • 1970-01-01
  • 2017-11-28
  • 1970-01-01
  • 1970-01-01
  • 2020-06-29
  • 1970-01-01
  • 2020-10-16
相关资源
最近更新 更多