我有个小标题:
library(tibble)
library(dplyr)
(
data <- tibble(
a = 1:3,
b = 4:6,
mycol = c('a', 'b', 'a')
)
)
#> # A tibble: 3 x 3
#> a b mycol
#> <int> <int> <chr>
#> 1 1 4 a
#> 2 2 5 b
#> 3 3 6 a
使用dplyr::mutate
,我想创建一个名为value
的新列,该列使用a
或b
列中的值,具体取决于指定的列名在mycol
列中。
(
desired <- tibble(
a = 1:3,
b = 4:6,
mycol = c('a', 'b', 'a'),
value = c(1, 5, 3)
)
)
#> # A tibble: 3 x 4
#> a b mycol value
#> <int> <int> <chr> <dbl>
#> 1 1 4 a 1
#> 2 2 5 b 5
#> 3 3 6 a 3
在这里,我们一直都在使用a
列中的值。
data %>%
mutate(value = a)
#> # A tibble: 3 x 4
#> a b mycol value
#> <int> <int> <chr> <int>
#> 1 1 4 a 1
#> 2 2 5 b 2
#> 3 3 6 a 3
在这里,我们只是将mycol
的值分配给新列,而不是从适当的列中获取值。
data %>%
mutate(value = mycol)
#> # A tibble: 3 x 4
#> a b mycol value
#> <int> <int> <chr> <chr>
#> 1 1 4 a a
#> 2 2 5 b b
#> 3 3 6 a a
我尝试了!!
,quo()
等的各种组合,但是我不完全了解NSE到底是怎么回事。
@Jaap将此标记为重复,但我仍然希望看到使用NSE而不是使用base R的dplyr / tidyverse方法。
答案 0 :(得分:1)
这是一种方法:
df %>%
mutate(value = ifelse(mycol == "a", a, b))
#output
# A tibble: 3 x 4
a b mycol value
<int> <int> <chr> <int>
1 1 4 a 1
2 2 5 b 5
3 3 6 a 3
这是基于R的更通用的方法
df$value <- diag(as.matrix(df[,df$mycol]))
更复杂的示例:
df <- tibble(
a = 1:4,
b = 4:7,
c = 5:8,
mycol = c('a', 'b', 'a', "c"))
df$value <- diag(as.matrix(df[,df$mycol]))
#output
# A tibble: 4 x 5
a b c mycol value
<int> <int> <int> <chr> <int>
1 1 4 5 a 1
2 2 5 6 b 5
3 3 6 7 a 3
4 4 7 8 c 8