gpt4 book ai didi

r - 使用 dplyr 按行用以前的值填充缺失值

转载 作者:行者123 更新时间:2023-12-04 11:16:48 25 4
gpt4 key购买 nike

我正在处理 R 中的数据框它有一些跨行的缺失值。接下来是数据框(dput 最后添加):

df
id V1 V2 V3 V4
1 01 1 1 1 NA
2 02 2 1 NA NA
3 03 3 1 NA NA
4 04 4 1 2 NA
每行都是不同的 id .如您所见,行有缺失值。我想知道如何获得以这种风格完成的数据框 由于我的真实数据非常大 :
df
id V1 V2 V3 V4
1 01 1 1 1 1
2 02 2 1 1 1
3 03 3 1 1 1
4 04 4 1 2 2
我试图使用 fill来自 tidyr但在行级别我遇到了问题。我看过一些帖子,它与 dplyr 一起使用功能 across但我找不到它。我试过使用 group_by(id)rowwise但我还没有成功。也只有以 V 开头的变量/列应该填充以前的值。
接下来是数据:
#Data
df <- structure(list(id = c("01", "02", "03", "04"), V1 = c(1, 2, 3,
4), V2 = c(1, 1, 1, 1), V3 = c(1, NA, NA, 2), V4 = c(NA, NA,
NA, NA)), class = "data.frame", row.names = c(NA, -4L))
非常感谢您的时间。

最佳答案

一种解决方案可能是使用 na.locf包中的函数 zoo结合pmap行操作中的函数。 na.locf取最近的非 NA值并替换所有即将到来的 NA值。提醒一下 c(...)在这两种解决方案中都捕获了 V1:V4 的所有值在每次迭代的每一行中。但是,我排除了 id列在两者中,因为它不参与我们的计算。

library(zoo)
library(purrr)

df %>%
mutate(pmap_df(., ~ na.locf(c(...)[-1])))

id V1 V2 V3 V4
1 01 1 1 1 1
2 02 2 1 1 1
3 03 3 1 1 1
4 04 4 1 2 2
或者我们可以使用 coalesce函数来自 dplyr .我们可以更换每个 NA每行中最后一个非 NA 的值值,我们之前用 na.locf 做的事情.但是这个解决方案有点冗长:
df %>%
mutate(pmap_df(., ~ {x <- c(...)[!is.na(c(...))];
coalesce(c(...), x[length(x)])}))

id V1 V2 V3 V4
1 01 1 1 1 1
2 02 2 1 1 1
3 03 3 1 1 1
4 04 4 1 2 2
或者你也可以使用这个:
library(purrr)

df %>%
mutate(across(!id, ~ replace(., is.na(.), invoke(coalesce, rev(df[-1])))))

id V1 V2 V3 V4
1 01 1 1 1 1
2 02 2 1 1 1
3 03 3 1 1 1
4 04 4 1 2 2
可以忽略警告消息。它实际上是因为我们有 6 NA 而产生的。值但应用的结果 coalesce每个向量上有 1 个元素,导致 4 个元素替换 6 个插槽。

关于r - 使用 dplyr 按行用以前的值填充缺失值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68003356/

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