在 R 中值 >0 的两列之间插入按行值 0

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)

非常感谢!

det*_*det 5

在两个正元素之间插入零的函数:

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使用是因为您想要对行进行更改。第二个用途是将其返回为列格式。