R 在管道中将字符串作为变量取消引用

R 在管道中将字符串作为变量取消引用,r,dplyr,R,Dplyr,我想从数据帧中删除重复行,仅针对特定列。可通过distinct获得: data <- tibble(a = c(1, 1, 2, 2), b = c(3, 3, 3, 4), z = c(5,4,5,5)) filtered_data <- data %>% distinct(a, b, .keep_all = T) dim(filtered_data) # [1] 3 3 eval似乎对数据的过滤次数做了一些有趣的事情。(并且,添加了一个额外的列。不过,我可以接受…)那

我想从数据帧中删除重复行,仅针对特定列。可通过
distinct
获得:

data <- tibble(a = c(1, 1, 2, 2), b = c(3, 3, 3, 4), z = c(5,4,5,5))
filtered_data <- data %>% distinct(a, b, .keep_all = T)
dim(filtered_data)  
# [1] 3 3
eval
似乎对数据的过滤次数做了一些有趣的事情。(并且,添加了一个额外的列。不过,我可以接受…)那么,如何获得类似的结果,就好像我使用了
a,b
,但却使用了一个变量

其他信息
我实际上是通过读取数据帧的列名来获得
gen
gen创建一个函数并使用它怎么样。也许这就是你想要的东西

rm_dup_rows <- function(data, ...){
  vars = dplyr::quos(...)
  data %>% distinct(!!! vars, .keep_all = T)
}

用于distinct的列数是否始终为2?由于eval只提供一个输出,因此您的示例案例的(丑陋的)解决方法可能是:
distinct(eval(解析(text=gen[1]))、eval(解析(text=gen[2])、.keep_all=T)
。但希望有人能拿出一个更优雅、更强大的解决方案。不,列并不总是2。它们在5到20之间波动…
unquote\u string
是一个聪明的解决方案。我建议您将helper函数重命名为类似于
unqoute\u charvec
的名称,以便对其功能进行更详细的描述。这可能并不重要,但它更像是
R
使用
lappy
而不是
for
循环,这样会更有效率。类似于
unquote\u charvec的东西似乎朝着这个方向发展。但是,问题是,我希望避免逐个提供列名:
rm_dup_rows(data,gen)
将是完美的,但是包含列名的字符串
gen
无法正确地取消引号。。。但是,我认为使用quosures可能是正确的方向。我在答案中添加了额外的部分,我相信这符合您的要求。如果我有一个解决方法,可以像使用quos一样将gen转换为无引号字符串,那将是近乎完美的。我通过收集
colnames()
来生成gen,只有当我必须使用
quos()
手动创建字符串时,它才会重新定位问题。我尝试了类似于
gen的方法,当与添加到问题中的
unquote string
函数结合使用时,这会给手工拼写所有变量带来相同的结果。
unquote_string <- function(string) {
  out <- list()
  i <- 1
  for (s in string) {
    t <- ensym(s)
    out[i] <-dplyr::quos(!!t)
    i <- i+1
  }
return(out)
}
gen_quo <- unquote_string(gen)
filtered_data <- rm_dup_rows(data, gen_quo)
dim(filtered_data)
# [1] 3 3 
rm_dup_rows <- function(data, ...){
  vars = dplyr::quos(...)
  data %>% distinct(!!! vars, .keep_all = T)
}
rm_dup_rows(data = data, a, b)

# A tibble: 3 x 3
  a     b     z
<dbl> <dbl> <dbl>
    1     3     5
    2     3     5
    2     4     5


rm_dup_rows(data, b, z)
# A tibble: 3 x 3
a     b     z
<dbl> <dbl> <dbl>
    1     3     5
    1     3     4
    2     4     5
rm_dup_rows <- function(data, vars){
  data %>% distinct(!!! vars, .keep_all = T)
}

# quos your column name vector
gen <- quos(a,z)

rm_dup_rows(data, gen)
# A tibble: 3 x 3
  a     b     z
 <dbl> <dbl> <dbl>
   1     3     5
   1     3     4
   2     3     5