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