dplyr::select 的评估在我的函数中不起作用
Evaluation with dplyr::select does not work in my function
我对处理 R 中的评估问题真的很陌生。
example<- data.frame(id = 1:5,
pairs0 = c(1, 1, 1, 2, 2),
pairs1 = c(2, 2, 1, 1, 1)
)
这是我要编写的函数:
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)
}
该函数选择一个数据框 df
并按列 col_pair
将其连接到自身。
问题是,如果我 运行 f(example, 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')
输出:
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
此外,如果需要非标准评估,您可以使用此:
#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)
}
我们申请:
#Apply
f(example, pairs0)
输出:
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
我对处理 R 中的评估问题真的很陌生。
example<- data.frame(id = 1:5,
pairs0 = c(1, 1, 1, 2, 2),
pairs1 = c(2, 2, 1, 1, 1)
)
这是我要编写的函数:
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)
}
该函数选择一个数据框 df
并按列 col_pair
将其连接到自身。
问题是,如果我 运行 f(example, 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')
输出:
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
此外,如果需要非标准评估,您可以使用此:
#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)
}
我们申请:
#Apply
f(example, pairs0)
输出:
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