r - 使用 purrr 按向量中的值进行过滤

标签 r function functional-programming

我想编写一个接受两个参数的函数:一个 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 是因为第一个 idfull_address 对(1abc)不是唯一的,等等...

最佳答案

该函数可以用 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/

相关文章:

c++ - 将单个字符传递给 C++ 中的函数

sql-server - tsql 用户定义函数

.net - 尝试通过 dotnetpublish 命令发布 azure 函数

c - C 函数式编程的意外结果

通过两个不同列中的两个条件删除 R 中的列

R 将表格保存为图像

javascript - 在subscribe里面调用subscribe好不好?

javascript - react 没有在输入更改时更新功能组件状态

r - 将输入向量的名称获取到 R 函数

html - ShinyDashboard 仪表板标题与浏览器中的 Logo 不符