Unknown or uninitialised column when using Lag in calculation
我试图在所述列的计算中引用同一列中的前一行。然而,这总是会导致\\'未知或未初始化的列\\' 警告消息和很多 NA\\'s.
1 2 3 4 5
| MovementData <- c(-1, -2, -1, 1, 2, 4)
Database <- data.frame(MovementData)
Database$Score <- ifelse(Database$MovementData <= 0 , 0,
ifelse(lag(Database$Score,1) == 0,1,2)) |
所需的输出:
1
| Database$Score <- c(0,0,0,1,2,2) |
我的计算意图如下:
如果 MovementData 为负,则得分为 0。如果 MovementData 为正且之前的得分为 0,则得分为 1。如果 MovementData 为正且之前的得分不为 0,则得分为 2。
这给了我前面提到的错误。
我正在寻找一种使用滞后(或其他函数)的方法,它可以在列本身的计算中引用 Database$Score 列中的前一行。
计算所述列时如何引用同一列中的前一行?
- 欢迎来到 SO。我还没有运行您的代码,但它显然不完整(缺少赋值运算符?)。另外,请将代码格式化为代码。
-
另外,请完成代码,意思是实际创建一个数据框。请尽量避免使用诸如 \\'df\\' 之类的对象名称,因为这是一个基本的 R 函数,您不想弄乱我们的环境。
-
最后但并非最不重要的一点,请提供所需的输出。
-
嗨@Tjebo,感谢您的评论。我是新来的。我进行了编辑,希望能纠正问题并更好地解释我的问题。
-
伟大的。现在,所需的输出肯定有助于了解您打算做什么。
-
@Tjebo 我试图在最后两行中这样做,我可以添加更多信息来帮助解释吗?或者我可能误解了你所说的期望输出是什么意思
-
我已经稍微编辑了您的问题 - 您可以使用 4spaces 缩进格式化为代码,或者只是选择所有内容并按 \\'ctrl K\\'(或 CMD K for Mac)。期望的输出:你希望你的列 Database$Score 最后是什么样子的
-
@Tjebo 非常感谢您的指导。我为分数列添加了一个期望的输出。这也需要格式化为代码吗?
-
行。理想情况下,再次将 code 格式化为 code ,例如包括赋值运算符并添加 c() 左右。我无法编辑此内容,因为这些更改太少
-
@Tjebo 我已经进行了更改。现在这一切正确吗?
-
伟大的。它看起来好多了。您现在(希望)意识到您的问题实际上可能是关于一个非常具体的问题,而不是一个非常普遍的问题 - 这通常是在此处获得帮助的最佳方式,针对非常具体的问题提出非常具体的问题。 . 为了帮助大家,问题还是有点不清楚。您究竟打算在新列中创建什么?你的 if-else 语句到底在做什么?这将是我们可以帮助解决的问题 - 这也可能有助于您了解引用的工作原理
-
@Tjebo 是的,这是我的第一篇文章,所以我现在正在学习它是如何工作的。请参阅我的最后一次编辑以解释我的意图。
-
伟大的。明天会看看 - 现在需要去睡觉 :D 或者也许其他人会找时间看看。
-
@Tjebo 谢谢!期待听到您的建议
看起来我们需要一个递归评估
1 2 3 4 5 6 7 8 9 10
| Database$Score[1] <- 0
for(i in 2:nrow(Database)) {
Database$Score[i] <- if(Database$MovementData[i] <= 0) {
0 } else if(Database$MovementData[i] > 0 &
Database$Score[i-1] == 0) {
1 } else 2}
Database$Score
#[1] 0 0 0 1 2 2 |
- 你好!谢谢,这似乎效果很好。当在 \\'MovementData\\' 列中添加更多数据(超过 6 行)或新数据时,这仍然有效吗? @akrun
-
@Aman Shergill:当然。 Akrun 使用 nrow(...) 作为 for 循环索引,这意味着它循环遍历每一行直到最后一行。
-
完美的!谢谢你的帮助