【问题标题】:How to select consecutive columns with across function dplyr [duplicate]如何选择具有跨函数dplyr的连续列[重复]
【发布时间】:2020-11-11 00:17:47
【问题描述】:

我想使用 dplyr 中的新 cross 函数来选择连续的列并将 NA 更改为零。但是,它不起作用。这似乎是一件非常简单的事情,所以可能是我错过了什么。

一个工作示例:

> m <- matrix(sample(c(NA, 1:10), 100, replace = TRUE), 10)
> d <- as.data.frame(m)

   V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
1   4  3 NA  3  7  6  6 10  6   5
2   9  8  9  5 10 NA  2  1  7   2
3   1  1  6  3  6 NA  1  4  1   6
4  NA  4 NA  7 10  2 NA  4  1   8
5   1  2  4 NA  2  6  2  6  7   4
6  NA  3 NA NA 10  2  1 10  8   4
7   4  4  9 10  9  8  9  4 10  NA
8   5  8  3  2  1  4  5  9  4   7
9   3  9 10  1  9  9 10  5  3   3
10  4  2  2  5 NA  9  7  2  5   5

这很好用:

mutate_at(vars(V1:V4), ~replace(., is.na(.), 0))

但是如果尝试这些选项我会得到一个错误:

d %>% mutate(across(vars(V1:V4)), ~replace(., is.na(.), 0))
d %>% mutate(across(V1:V4)), ~replace(., is.na(.), 0))
d %>% mutate(across("V1":"V4")), ~replace(., is.na(.), 0))

我不知道为什么这不起作用

【问题讨论】:

  • 你很接近,只是括号不正确:d %&gt;% mutate(across(V1:V4, ~ replace(., is.na(.), 0)))
  • 哦,它在cross函数内部,我不清楚。感谢您的帮助,您可以将其发布为答案。
  • 另请注意,tidyr 提供 replace_na

标签: r dplyr


【解决方案1】:

across() 中,有两个基本参数。第一个参数是要修改的列,而第二个参数是应该应用于列的函数。此外,不再需要vars() 来选择变量。因此,正确的形式是:

d %>%
 mutate(across(V1:V4, ~ replace(., is.na(.), 0)))

   V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
1   2  6  0  6  5  6 10  5  3   1
2   2  9  2  4 10  6  9  4 NA  NA
3   5  5  3  0  3  7  1  5  9   5
4   7  1  1  6  2  1  8 NA  8   4
5   3  5  3  0  2  3  4  2  3  NA
6   0 10  0  2  5 10  1 10  4   3
7   4  3 10  6 NA  5  9  3  3   9
8   9  9  8  5  8  1  3  1 NA  10
9   6  3  0  1  1  9  3  5  8   4
10  3  2  9  1  5  2  4 NA  6   1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-28
    • 2020-12-10
    • 2016-09-17
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    • 2020-06-25
    • 1970-01-01
    相关资源
    最近更新 更多