【问题标题】:Using purrr map to apply function to selection of columns in DataFrame in dplyr pipeline使用 purrr map 将函数应用于 dplyr 管道中 DataFrame 中的列选择
【发布时间】:2019-08-21 02:39:41
【问题描述】:

我有以下数据框

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")]))

标签: r tidyverse purrr


【解决方案1】:

我们可以使用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]))

【讨论】:

  • 这行得通。我仍在努力学习令人困惑的咕噜声。谢谢
【解决方案2】:

正如 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-27
    • 1970-01-01
    • 1970-01-01
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多