【发布时间】:2020-01-14 12:47:03
【问题描述】:
这里缺少一些小东西,并且难以将列传递给函数。我只想在列上map(或lapply)并在每个列上执行自定义功能。这里的最小示例:
library(tidyverse)
set.seed(10)
df <- data.frame(id = c(1,1,1,2,3,3,3,3),
r_r1 = sample(c(0,1), 8, replace = T),
r_r2 = sample(c(0,1), 8, replace = T),
r_r3 = sample(c(0,1), 8, replace = T))
df
# id r_r1 r_r2 r_r3
# 1 1 0 0 1
# 2 1 0 0 1
# 3 1 1 0 1
# 4 2 1 1 0
# 5 3 1 0 0
# 6 3 0 0 1
# 7 3 1 1 1
# 8 3 1 0 0
一个仅用于过滤和计算数据集中剩余唯一 ID 的函数:
cnt_un <- function(var) {
df %>%
filter({{var}} == 1) %>%
group_by({{var}}) %>%
summarise(n_uniq = n_distinct(id)) %>%
ungroup()
}
它在地图之外工作
cnt_un(r_r1)
# A tibble: 1 x 2
r_r1 n_uniq
<dbl> <int>
1 1 3
我想在所有 r_r 列上应用该函数以获得类似:
df2
# y n_uniq
# 1 r_r1 3
# 2 r_r2 2
# 3 r_r3 2
我认为以下方法可行,但没有
map(dplyr::select(df, matches("r_r")), ~ cnt_un(.x))
有什么建议吗?谢谢
【问题讨论】: