我尝试在列的两个不等于零的值之间插入 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/