【问题标题】:Why is a calculated vector is behaving differenty than an assigned vector, even though they are both returning the same values?为什么计算向量的行为与分配的向量不同,即使它们都返回相同的值?
【发布时间】:2020-01-12 10:27:22
【问题描述】:

我正在尝试根据计算的索引填充 Tidy data.frame。从计算值创建索引向量后,我可以测试并确认计算值是否正确。但是,当我使用该向量将值分配给 data.frame 中的行时,我可以看到这些值没有被完全填充到正确的行中(另外一行不应该被填充)。当我使用 from:to 方法将相同的值分配给向量时,这些值会填充到正确的行中。

当我使用from:to 方法将相同的值分配给向量时,这些值会填充到正确的行中。

PostPulseIndices <- ((Alpha+StepDuration)/SampleInterval+1) : ((Alpha+StepDuration+0.120)/SampleInterval)

产生正确的结果:

> head(PostPulseIndices)
[1] 2801 2802 2803 2804 2805 2806

但是,当用于填充 data.frame 中特定列中的行时,值会提前填充一行:

DataFrame$"A1 min"[PostPulseIndices] <- A1_min
DataFrame$"A2 min"[PostPulseIndices] <- A2_min
> DataFrame[2799:2802,]
     A1 min A2 min
2799     NA     NA
2800  0.001  8e-04
2801  0.001  8e-04
2802  0.001  8e-04

为什么 A1 和 A2 应该填充在第 2801 行(索引向量开始的位置),而它们却填充在第 2800 行,我如何确保继续填充正确的行?

编辑:根据@Gregory 对附加代码的要求,以下是用于计算 PostPulseIndices 的值:

Alpha <- 0.02   
StepDuration <- 0.120
SampleInterval <- 5e-05 

这是用于创建 data.frame 的代码:

Sweeps <- 1
SweepDuration <- 0.3
x <- seq(SampleInterval, SweepDuration, by = SampleInterval) 
ColNames <- c("A1 min", "A2 min")
DataFrame <- setNames(data.frame(matrix(ncol = (length(ColNames)), nrow = (length(x) * Sweeps))), ColNames)

【问题讨论】:

  • 澄清一下,当我使用from:to 表示法为索引值分配相同的值时,data.frame 会按预期填充从 2801 开始的指定列。

标签: r vector indexing


【解决方案1】:

下面的最小工作示例不会重现发生在您身上的事情。你能提供一个可重现的例子吗?

df <- data.frame(letters = letters[1:10], value = NA)
indicies <- 3:10
df[indicies,]$value <- 1
df

# letters value
# 1        a    NA
# 2        b    NA
# 3        c     1
# 4        d     1
# 5        e     1
# 6        f     1
# 7        g     1
# 8        h     1
# 9        i     1
# 10       j     1

【讨论】:

  • 我试图通过为向量赋值来重现问题,但问题没有重现。我应该编辑上面的评论以链接到代码本身吗?
  • 与其链接一个巨大的数据集(总比没有好),您可以尝试将数据减少到最小程度地重现问题吗?您可以使用dplyr::sample_n 获取随机行(某些会导致问题,但不会导致其他问题?)和dplyr::select 仅选择相关列。然后在缩减的数据帧上调用 dput(reduced_dataframe_name) 并将输出复制到问题中的代码块中。
  • 哈哈。我认为您不太了解最小的reproducible example。尝试创建一些我们可以运行的代码,这些代码将创建数据框,执行您想要的操作,并产生我们可以与您期望的结果进行比较的结果。它不应占用 30,000 行和 36 列。
  • @carbontaxfan 也就是说,您有重复的列名,可能会给您带来麻烦(“fit2 Tau2”被使用了 3 次)。我在你的数据帧上运行了你的代码(就我可以把它放在一起)它产生了你预期的结果,并且没有重现问题。
  • 很好地抓住了列名。这不是导致这个问题的原因,但会在路上给我带来问题。我删除了无关的列和行。由于问题在于计算出的示例,因此我保持原样。
猜你喜欢
  • 2022-06-30
  • 1970-01-01
  • 1970-01-01
  • 2020-03-06
  • 1970-01-01
  • 2014-08-19
  • 1970-01-01
  • 2010-10-21
  • 1970-01-01
相关资源
最近更新 更多