gpt4 book ai didi

使用类似合并的函数替换行中的 NA

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

我正在尝试看看我是否可以使用 dplyrcoalesce 或类似的东西以相同的方式组合行 coalesce合并列。

我发现了其他一些类似的帖子,但没有一个能回答我的问题。

这是一个玩具示例:

df <- read.table(sep = "|", header = F, stringsAsFactors = F, text = 
"a|NA|NA|d|NA
NA|b|NA|NA|e
a|NA|c|NA|e
1|2|3|4|5
1|2|3|4|5
1|2|3|4|5
1|2|3|4|5")

> df
V1 V2 V3 V4 V5
1 a <NA> <NA> d <NA>
2 <NA> b <NA> <NA> e
3 a <NA> c <NA> e
4 1 2 3 4 5
5 1 2 3 4 5
6 1 2 3 4 5
7 1 2 3 4 5

我想将第 1、2 和 3 行合并为一行,我可以将其用作标题。输出应如下所示:

  V1 V2 V3 V4 V5
1 a b c d e
2 1 2 3 4 5
3 1 2 3 4 5
4 1 2 3 4 5
5 1 2 3 4 5

我希望这样的事情能奏效:

df %>% 
rowwise() %>%
coalesce(1,2,3) %>%
slice(-c(1:2))

这行得通,但感觉很笨拙:

df %>% 
slice(1:3) %>%
fill(everything(), .direction = "down") %>%
slice(3) %>%
bind_rows(df %>%
slice(-c(1:3)))

我想要更直接、更优雅的东西。

最佳答案

也许是这样的?

df %>% slice_tail(n = 4) %>% 
set_names(
df %>% slice_head(n = 3) %>% map_chr(lift_dv(coalesce))
)
#> a b c d e
#> 1 1 2 3 4 5
#> 2 1 2 3 4 5
#> 3 1 2 3 4 5
#> 4 1 2 3 4 5

reprex package 创建于 2021-07-14 (v1.0.0)


解释

前三行应该用来计算列名。我们可以使用 slice_head() 提取它们。

df %>% slice_head(n = 3)
#> V1 V2 V3 V4 V5
#> 1 a <NA> <NA> d <NA>
#> 2 <NA> b <NA> <NA> e
#> 3 a <NA> c <NA> e

现在我们需要找出一种在每一列上应用合并的方法在切片中。我们可以使用 summariseacross,但因为我们不是寻找数据框作为输出,我更喜欢使用 map 。如果我们只是映射切片的身份函数我们可以看到 map 如何与 datframe 一起工作输入。

df %>% slice_head(n = 3) %>% map(~.)
#> $V1
#> [1] "a" NA "a"
#>
#> $V2
#> [1] NA "b" NA
#>
#> $V3
#> [1] NA NA "c"
#>
#> $V4
#> [1] "d" NA NA
#>
#> $V5
#> [1] NA "e" "e"

如您所见,数据框实际上只是一种包含向量的列表等长。因此,如果我们想要,map 函数非常有用对数据框中的每一列应用一些东西。

现在我们需要弄清楚如何在这些向量上使用合并。要是我们手动测试第一个案例 ($V1),我们发现有一个小问题。

coalesce(c("a", NA, "a"))
#> [1] "a" NA "a"

什么都没发生?!这是因为 coalesce 将其参数作为动态点

coalesce("a", NA, "a")
#> [1] "a"

这意味着我们需要找出一种解包向量的方法。为此我们可以使用!解压载体(你可以阅读它 here ) 或者或者使用组合助手来自 purrr可以转换获取列表、点或向量的函数。合并需要点,我们希望它取向量,这意味着我们应该使用 lift_dv

x <- c("a", NA, "a")
coalesce(!!!x)
#> [1] "a"
lift_dv(coalesce)(x)
#> [1] "a"

关于使用类似合并的函数替换行中的 NA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68372948/

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