gpt4 book ai didi

r - 取消引用字符串作为管道中的变量

转载 作者:行者123 更新时间:2023-12-04 21:03:53 25 4
gpt4 key购买 nike

我想从数据框中删除重复的行,仅针对特定列。这可以通过 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

这(几乎)是我需要的。然而,我的问题是我需要使用的列名 distinct将改变。所以我有一个字符串 gen包含我想用于 distinct 的列的名称功能。他们需要不被引用才能在管道中有用。我找到了使用建议 as.name()eval(parse()) .然而,这给了我不同的结果:
gen <- c("a", "b")
filtered_data <- data %>% distinct(eval(parse(text = gen)), .keep_all = T)
dim(filtered_data)
# [1] 2 4
eval似乎对过滤数据的次数做了一些有趣的事情。 (并且,增加了一个额外的列。不过我可以接受……)那么,如何获得类似的结果,就像我使用了 a,b 一样。 ,但是通过使用变量来代替?

附加信息
我实际上获得了 gen通过读取数据框的列名: gen <- colnames(data)[1:2] .如果我有办法转换 gen,@gymbrane 建议的解决方案将是完美的至 c(a, b) .重点是避免对列名进行硬编码。我尝试过诸如 gen <- noquotes(gen) 之类的东西,这不会在 rm_dup_rows 中给出错误下面建议的函数,但它确实给出了不同的结果,给出了与我开始时相同类型的重复过滤......

固定
我想我得到了它的工作。这可能不雅,我不确定结果是否需要每一步,但它似乎可以通过将下面@gymbrane 提供的功能与 ensym 结合起来工作。和 quos在 forloop 中添加到 GlobalEnv 中的列表中(编辑:不需要 GlobalEnv):
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

最佳答案

如何创建一个函数并使用 quosures .也许这样的事情就是你正在寻找的......

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稍微用 quos 构建和你的载体.像这样的东西...
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

关于r - 取消引用字符串作为管道中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51614933/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com