在dplyr管道中使用purrr map将函数应用于DataFrame中的列选择

4

I have the following dataframe

test <- data.frame(x = c(6, 9, 3, NA),
                   y = c(3, NA, 2, 3),
                   z = c(6, 3, NA, 5),
                   h = c(NA, 6, 7, 2))

这是我想要迭代的列列表。
mylist <- list(test$y, test$z)

我想根据ifelse条件更改“y”和“z”列。
以下是我的尝试...似乎无法工作。
test <- test %>%
          map_df(mylist, if(is.na(mylist), 0, 1))

实际上我有一个更大的数据框,这只是测试数据。

我需要使用mutate吗?
我能在管道中使用select吗?像这样:

test <- test %>%
          map_df(select(y, z), if(is.na(.), 0, 1))

以下是预期输出:

这是预期的输出


test <- data.frame(x = c(6, 9, 3, NA),
                   y = c(1, 0, 1, 1),
                   z = c(1, 1, 0, 1),
                   h = c(NA, 6, 7, 2))

感谢您的帮助。

只需执行 test[c("y","z")] = +(!is.na(test[c("y","z")])) - Onyambu
2个回答

3
我们可以使用mutate_at来指定列。
library(dplyr)
test %>%  mutate_at(vars(y, z), ~as.integer(!is.na(.)))

#   x y z  h
#1  6 1 1 NA
#2  9 0 1  6
#3  3 1 0  7
#4 NA 1 1  2

或者如果更喜欢使用ifelse

test %>% mutate_at(vars(y, z), ~ifelse(is.na(.), 0, 1))

我们也可以在基础R中实现相同的功能。
cols <- c("y", "z")
test[cols] <- as.integer(!is.na(test[cols]))

这个可行。我仍在努力学习 purrr,这有点令人困惑。谢谢。 - E50M

0

正如 OP 提到的关于 purrr 中的 map,请使用 map_at

library(tidyverse)
test %>%
    map_at(vars('y', 'z'), ~ +(!is.na(.x))) %>%
    bind_cols
# A tibble: 4 x 4
#       x     y     z     h
#  <dbl> <int> <int> <dbl>
#1     6     1     1    NA
#2     9     0     1     6
#3     3     1     0     7
#4    NA     1     1     2

或者我们可以使用 base R 来完成这个任务。

test[c('y','z')] <- +(!is.na(test[c('y', 'z')]))
test
#   x y z  h
#1  6 1 1 NA
#2  9 0 1  6
#3  3 1 0  7
#4 NA 1 1  2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接