【问题标题】:Adding new column with diff() function when there is one less row in R当 R 中少一行时,使用 diff() 函数添加新列
【发布时间】:2017-01-23 15:51:35
【问题描述】:

如果我有一个像 mtcars 这样的示例数据框,并且我想找到所有行的 mtcars$qsec 之间的差异,我可以做 diff(mtcars$qsec)。但是有没有一种简单的方法可以使 diff(mtcars$qsec) 在原始 mtcars 数据框中成为一个新列?我发现这很困难,因为 diff(mtcars$qsec) 比其他 mtcars 少一行。

> head(mtcars,3)

               mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Mazda RX4     21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag 21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
Datsun 710    22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1

【问题讨论】:

标签: r diff


【解决方案1】:

这里有两种方法。两者都将NA 放在diff_qsec 的第一行,并将diff(qsec) 放在其余行:

library(dplyr)  
mtcars %>% mutate(diff_qsec = qsec - lag(qsec)) # dplyr has its own version of lag

transform(mtcars, diff_qsec = c(NA, diff(qsec)))

另外,关于填充的一般问题,请参阅:How can I pad a vector with NA from the front?

【讨论】:

    【解决方案2】:

    你可以像这样使用 inside() 的基本函数:

    mtcars <- within(mtcars, difference <- c(NA,diff(qsec)))
    

    这将创建一个名为“difference”的列,其中第一个元素 NA 和其余元素由 diff(qsec) 计算。

    您可以通过在 {} 中包装命令来同时创建更多列,例如:

    mtcars <- within(mtcars, {difference <- c(NA,diff(qsec))
                             multiple <- qsec*2})
    

    请注意,您必须使用

    【讨论】:

    • 您可以像通常使用偏移量一样添加列吗? mtcars$dmpg
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多