Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用dplyr::select进行计算在我的函数中不起作用_R_Dplyr_Evaluation_Tidyselect - Fatal编程技术网

使用dplyr::select进行计算在我的函数中不起作用

使用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,

我对处理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
,并通过列
列对将其连接到自身。
问题是,如果我运行
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
部分。结果是一样的。我已经测试过:)