Почему [работает, но не [[в mutate при поиске значения (dplyr в R)? - PullRequest
1 голос
/ 20 марта 2019

У меня есть именованный вектор, который по сути является таблицей поиска.Таким образом, имена каждого элемента представляют ключ, в то время как элемент представляет значение.

У меня есть фрейм данных, который содержит случайную выборку значений ключа, которые появляются в векторе выше.Мое намерение состоит в том, чтобы сопоставить ключ и получить значение для каждого ключа.

Это легко сделать с помощью mutate из пакета dplyr .Однако в процессе поиска я получаю сообщение об ошибке, если пытаюсь использовать [[ вместо [.Насколько я понимаю, для векторов обе функции должны возвращать вектор.

Может кто-нибудь объяснить, почему это происходит?Минимальный воспроизводимый пример приведен ниже.

x <- c("1" = "a", "2" = "b", "3" = "c")
df <- data.frame(
  k = sample(c(1, 2, 3), 10, replace = TRUE),
  v = rnorm(10)
)
library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
df %>%
  mutate(k2 = x[k])
#>    k          v k2
#> 1  1 -0.7502716  a
#> 2  1 -0.4002250  a
#> 3  1  0.4878860  a
#> 4  2  1.2878120  b
#> 5  3  0.6410854  c
#> 6  3 -0.6821807  c
#> 7  1  1.4106239  a
#> 8  3  0.9909921  c
#> 9  2  0.3808955  b
#> 10 3  1.6117826  c
df %>%
  mutate(k2 = x[[k]])
#> Error in x[[k]]: attempt to select more than one element in vectorIndex

1 Ответ

2 голосов
/ 20 марта 2019

Мы можем использовать [ вместо [[, поскольку @Frank упомянул о разнице в length входного аргумента, который он принимает ([[ - работает с длиной 1, в то время как [ работает с 1 или более) и сопоставьте имена 'x', преобразовав класс 'k' в класс character и получив значения из 'x', чтобы создать 'k2' (при условии, что мы хотим получить значения для совпадающих имен, а не на основе числового индекса)

df %>%         
    mutate(k2 =  x[as.character(k)])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...