gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:56:21 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com