使用dplyr::select进行计算在我的函数中不起作用
我对处理R中的评估问题真的很陌生使用dplyr::select进行计算在我的函数中不起作用,r,dplyr,evaluation,tidyselect,R,Dplyr,Evaluation,Tidyselect,我对处理R中的评估问题真的很陌生 example<- data.frame(id = 1:5, pairs0 = c(1, 1, 1, 2, 2), pairs1 = c(2, 2, 1, 1, 1) ) 示例%select(j,col_对), 后缀=c('1','2'), by=“{col_pair}}”, 保持=真)%>% 过滤器(j1!=j2) } 该函数拾取数据帧df,
example<- data.frame(id = 1:5,
pairs0 = c(1, 1, 1, 2, 2),
pairs1 = c(2, 2, 1, 1, 1)
)
示例%select(j,col_对),
后缀=c('1','2'),
by=“{col_pair}}”,
保持=真)%>%
过滤器(j1!=j2)
}
该函数拾取数据帧df
,并通过列列对将其连接到自身。
问题是,如果我运行f(例如,pairs0)
,我会得到“连接列必须存在于数据中”
有人能帮忙吗?我已经对您的函数进行了修改,您可以将其视为一个选项,因为它使用带引号的变量,并且与使用其他求值方案相比,麻烦更少。代码如下:
#Function
f <- function(df, col_pair){
df2 <- df %>% mutate(j = row_number())
full_join(df2 %>% select(j, col_pair),
df2 %>% select(j, col_pair),
suffix = c('1', '2'),
by = col_pair,
keep = TRUE) %>%
filter(j1 != j2)
}
#Apply
f(example, 'pairs0')
此外,如果需要非标准评估,您可以使用:
#Option 2
f <- function(df, col_pair){
var <- enquo(col_pair)
df2 <- df %>% mutate(j = row_number())
full_join(df2 %>% select(j, !!var),
df2 %>% select(j, !!var),
suffix = c('1', '2'),
by = rlang::as_name(var),
keep = TRUE) %>%
filter(j1 != j2)
}
输出:
j1 pairs01 j2 pairs02
1 1 1 2 1
2 1 1 3 1
3 2 1 1 1
4 2 1 3 1
5 3 1 1 1
6 3 1 2 1
7 4 2 5 2
8 5 2 4 2
j1 pairs01 j2 pairs02
1 1 1 2 1
2 1 1 3 1
3 2 1 1 1
4 2 1 3 1
5 3 1 1 1
6 3 1 2 1
7 4 2 5 2
8 5 2 4 2
我对你的函数做了一个修改,你可以把它看作是一个选项,因为它使用带引号的变量,与使用其他求值方案相比,麻烦更少。代码如下:
#Function
f <- function(df, col_pair){
df2 <- df %>% mutate(j = row_number())
full_join(df2 %>% select(j, col_pair),
df2 %>% select(j, col_pair),
suffix = c('1', '2'),
by = col_pair,
keep = TRUE) %>%
filter(j1 != j2)
}
#Apply
f(example, 'pairs0')
此外,如果需要非标准评估,您可以使用:
#Option 2
f <- function(df, col_pair){
var <- enquo(col_pair)
df2 <- df %>% mutate(j = row_number())
full_join(df2 %>% select(j, !!var),
df2 %>% select(j, !!var),
suffix = c('1', '2'),
by = rlang::as_name(var),
keep = TRUE) %>%
filter(j1 != j2)
}
输出:
j1 pairs01 j2 pairs02
1 1 1 2 1
2 1 1 3 1
3 2 1 1 1
4 2 1 3 1
5 3 1 1 1
6 3 1 2 1
7 4 2 5 2
8 5 2 4 2
j1 pairs01 j2 pairs02
1 1 1 2 1
2 1 1 3 1
3 2 1 1 1
4 2 1 3 1
5 3 1 1 1
6 3 1 2 1
7 4 2 5 2
8 5 2 4 2
看起来你在那里混合了merge
选项,all.x
不是dplyr::left_join
(虽然它在包含时不会产生警告/错误)。你在哪里尝试使用任何tidyselect
逻辑?@r2evans抱歉,我的意思是我怀疑我是否应该使用{col pair}
相反,您可以在函数中使用{{{col\u pair}}
来完成此操作;但是使用上一个过滤器操作,您不会得到任何行back@starja现在我注意到我的函数中有一个错误,它看起来像是在混合merge
选项,all.x
不是dplyr::left\u join
的参数(尽管它在包含时不会产生警告/错误)。你在哪里尝试使用任何tidyselect
逻辑?@r2evans对不起,我的意思是我怀疑我是否应该使用{{colu-pair}
之类的东西,而不是你可以在你的函数中使用{colu-pair}
;但是使用上一个过滤器操作,您不会得到任何行back@starja现在我注意到我的功能有一个错误谢谢!你能看一下最新的问题吗?我只想在col\u pair
列上加入,这样我在处理full\u-join
@Duck中的by
参数时就有麻烦了。你是说enquo
和代码>使用新的评估标准?阅读时,我想,{{}
是镇上新来的孩子吗?@starja是的,两人都是镇上新来的孩子,在dplyr
中执行函数,至少这是我所看到的。对不起,如果我错了,我把你弄糊涂了@我已经为你想要的东西添加了一个更新,也许对你有帮助@这是一个警告。它引用了来自dplyr的新函数来完成这项任务。尝试用by=all\u of(col\u pair)
更改by=col\u pair
部分。结果是一样的。我已经测试过了:)谢谢!你能看一下最新的问题吗?我只想在col\u pair
列上加入,这样我在处理full\u-join
@Duck中的by
参数时就有麻烦了。你是说enquo
和代码>使用新的评估标准?阅读时,我想,{{}
是镇上新来的孩子吗?@starja是的,两人都是镇上新来的孩子,在dplyr
中执行函数,至少这是我所看到的。对不起,如果我错了,我把你弄糊涂了@我已经为你想要的东西添加了一个更新,也许对你有帮助@这是一个警告。它引用了来自dplyr的新函数来完成这项任务。尝试用by=all\u of(col\u pair)
更改by=col\u pair
部分。结果是一样的。我已经测试过:)