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

标签 r data.table interpolation rowwise

我尝试在列的两个不等于零的值之间插入 0 值:R 中 data.table 的 2018 到 2021。这就是示例数据 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

为了方便的重现性:

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"))

df1 中,存在两个数字之间为零的情况 >0(例如,第 1 行/2020 列、第 4 行/2019 列或第 7 行 2019 列)。我尝试识别这些情况并将它们与相邻列进行插值(例如;第 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

非常感谢!

最佳答案

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

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)
}

将函数应用于年份列的所有行:

year_cols <- names(df1)[grep("^[0-9]+$", names(df1))]
df1[, (year_cols) := transpose(lapply(transpose(.SD), f)), .SDcols = year_cols]
使用

transpose 是因为您想对行进行更改。第二种用途是将其返回为列格式。

关于r - 在 R 中值 >0 的两列之间插入 0 的行值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70107909/

相关文章:

r - Dplyr select抛出解析为整数错误的结果,但是基本select有效,为什么?

r - tidytext、Quanteda 和 tm 返回不同的 tf-idf 分数

r - Red Hat Linux 上的 data.table R fwrite 错误

R:不同日期的栅格图层之间的插值

python - 如何用plotly绘制椭圆体

r - 如何查找监控位置的开始和结束日期

r - 按ID分组,新表的每个元素都是一个vector

r - 如何按 R 数据表中的特定列分组后选择行的子集

interpolation - 哪种多元插值方法最适合实际使用?

image - 使用 gnuplot pm3d 和 pdf 输出生成的图像中有问题的莫尔图案