fju*_*urt 2 interpolation r data.table rowwise
我尝试在 R 中的 a 的 2018 到 2021 行中按行不等于 0 的两个值之间插入 0 值。data.table示例数据如下所示df1:
ID string1 2018 2019 2020 2021 string2
1: a1 x2 3 3 0 4 si
2: a2 g3 5 5 4 0 q2
3: a3 n2 11 0 0 3 oq
4: a4 m3 3 0 9 8 mx
5: a5 2w 9 1 6 5 ix
6: a6 ps2 2 4 7 4 p2
7: a7 kg2 6 0 9 6 2q
Run Code Online (Sandbox Code Playgroud)
为了方便的重现性:
df1 = data.table(
ID = c("a1", "a2", "a3", "a4", "a5", "a6", "a7"),
"string1" = c("x2", "g3", "n2", "m3", "2w", "ps2", "kg2"),
"2018" = c(3,5,11,3,9,2,6),
"2019" = c(3,5,0,0,1,4,0),
"2020" = c(0,4,0,9,6,7,9),
"2021" = c(4,0,3,8,5,4,6),
"string2" = c("si", "q2", "oq", "mx", "ix", "p2", "2q"))
Run Code Online (Sandbox Code Playgroud)
在df1某些情况下,两个数字之间的零值大于 0(例如,2020 年第 1 行/列、2019 年第 4 行/列或 2019 年第 7 行列)。我尝试识别这些情况,并将它们与相邻列进行插值(例如;第 1 行/2020 列:3 + 4 =3.5)。
有办法解决吗?到目前为止,我只找到了一种替换所有零值的方法,但没有两个数字之间>0的条件。
我尝试得到这样的输出:
ID string1 2018 2019 2020 2021 string2
1: a1 x2 3 3.0 3.5 4 si
2: a2 g3 5 5.0 4.0 0 q2
3: a3 n2 11 0.0 0.0 3 oq
4: a4 m3 3 6.0 9.0 8 mx
5: a5 2w 9 1.0 6.0 5 ix
6: a6 ps2 2 4.0 7.0 4 p2
7: a7 kg2 6 7.5 9.0 6 2q
Run Code Online (Sandbox Code Playgroud)
非常感谢!
在两个正元素之间插入零的函数:
f <- function(vec){
prev_val <- shift(vec, 1, fill = 0)
next_val <- shift(vec, -1, fill = 0)
fifelse(prev_val > 0 & next_val > 0 & vec == 0, (prev_val + next_val) / 2, vec)
}
Run Code Online (Sandbox Code Playgroud)
将函数应用于年份列的所有行:
year_cols <- names(df1)[grep("^[0-9]+$", names(df1))]
df1[, (year_cols) := transpose(lapply(transpose(.SD), f)), .SDcols = year_cols]
Run Code Online (Sandbox Code Playgroud)
transpose使用是因为您想要对行进行更改。第二个用途是将其返回为列格式。
| 归档时间: |
|
| 查看次数: |
265 次 |
| 最近记录: |