沿行传播计算
Propagating calculation along rows
使用以下数据,如何传播
计算依次填入两个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]。谢谢。
这是 base 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 并替换它如果为 TRUE,则为 0。将这三项相加,并将生成的向量提供给 cumsum
以产生累积和。最后,with
用于减少打字。
使用以下数据,如何传播
计算依次填入两个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]。谢谢。
这是 base 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 并替换它如果为 TRUE,则为 0。将这三项相加,并将生成的向量提供给 cumsum
以产生累积和。最后,with
用于减少打字。