按行

时间:2017-01-24 21:07:28

标签: r dplyr na


使用以下数据,如何传播 计算以填充两个NA's

df <- structure(
  list(
    x = c(0L, 30L, 40L),
    ed0 = c(0.24329772574554,
            NA, NA),
    kd = c(
      -0.0352736803781794,
      -0.0431451671867429,
      -0.0405766219035099
    )
  ),
  .Names = c("x", "ed0", "kd"),
  row.names = c(NA, -3L),
  class = c("tbl_df",
            "tbl", "data.frame")
)

df
#>    x       ed0          kd
#> 1  0 0.2432977 -0.03527368
#> 2 30        NA -0.04314517
#> 3 40        NA -0.04057662

所以第一个NA的值为30 + df $ ed0 [1] + df $ kd [1],第二个NA NA的值为40 + df $ ed0 [2] ](在上一步计算)+ df $ kd [2]。谢谢。

1 个答案:

答案 0 :(得分:1)

这是基础R中相当简单的方法。

with(df, cumsum(x + ifelse(is.na(ed0), 0, ed0) + c(0, head(kd, -1))))
[1]  0.2432977 30.2080240 70.1648789

为了解决此问题,x保持不变,c(0, head(kd, -1))设置kd的滞后向量,其中初始值为0. ifelse(is.na(ed0), 0, ed0)检查ed0的每个元素是否为NA并将其替换为0如果是真的。将这三个项相加在一起,并将得到的矢量赋予cumsum以产生累积和。最后,with用于减少输入。