我想编写一个接受两个参数的函数:一个 data.frame 和一个向量(此处称为 id_var)。 然后,它通过 id_var 中的值(例如向量中的第一个值)过滤 data.frame,将生成的 data.frame 添加到名为 data_filt_by_var 的变量中。
如果 data_filt_by_var
中的行数大于 1...它采用相同的初始 data.frame
,并按相同的 id_var 进行过滤
code> 值并选择不同的 end
(end 是 data.frame 中存在的名称),并获取其行数。如果行数为 >= 1
,则返回 1
,否则返回 0
。
问题是,它必须对 id_var 中的每个值执行此操作。如果不使用循环,我就无法使此迭代工作,这是不可取的。 我编写了以下函数,但它不起作用。
is_this_unique = function(data, id_var) {
data_filt_by_var = nrow(data[data$id == id_var, ])
if (data_filt_by_var >= 1) {
if (nrow(data[data$id == id_var, ] %>%
distinct(full_address)) == 1) {
return(1)
}
} else {
return(0)
}
}
sample_data = (tibble::tribble(~id, ~full_address,
1,'abc',
1,'bcd',
1,'abc',
2,'qaa',
2,'xcv',
2,'qaa'))
id_var = c(1,2)
我希望在此函数中使用map_dbl
。
预期输出为:
输入:
>is_this_unique(sample_data, id_var)
期望的输出:
[1] 0 1 0 1 0 1
第一个 0 是因为第一个 id
和 full_address
对(1
和 abc
)不是唯一的,等等...
最佳答案
该函数可以用 tidyverse 编写,而无需使用 purrr
的任何循环。这似乎是 group_by
对传递到函数中的“id”进行过滤
后的频率计数。在本例中,我们按“id”和所需的列(在 curly-curly -{{}}
内)进行分组,通过检查行数 (n()
) 等于 1。如果我们传递一个不在数据集中的 'idvar',它通常会返回 integer(0)
,可以将其更改为 0末尾的 if/else
条件
library(dplyr)
is_this_unique <- function(data, id_var, colNm) {
out <- data %>%
filter(id %in% id_var) %>%
group_by(id, {{colNm}}) %>%
transmute(n = +(n() == 1)) %>%
pull(n)
if(length(out) > 0) out else 0
}
is_this_unique(sample_data, 1:2, full_address)
#[1] 0 1 0 0 1 0
is_this_unique(sample_data, 1, full_address)
#[1] 0 1 0
is_this_unique(sample_data, 0, full_address)
#[1] 0
关于r - 使用 purrr 按向量中的值进行过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59571794/