#r #dplyr
#r #dplyr
Вопрос:
У меня есть именованный вектор, который по сути является таблицей поиска. Таким образом, имена каждого элемента представляют ключ, в то время как элемент представляет значение.
У меня есть фрейм данных, который содержит случайную выборку значений ключей, которые отображаются в приведенном выше векторе. Мое намерение состоит в том, чтобы сопоставить ключ и получить значение для каждого ключа.
Этого легко достичь, используя 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. Это потому, что вы использовали другой оператор для присваивания внутри data.frame
k <-
вместоk=
orv=
2. С
x[[i]]
,i
должно иметь длину единицы, как объясняется ошибкой. Также, да, ваши столбцы имеют тарабарские имена по причине, упомянутой акруном.
Ответ №1:
Мы можем использовать [
вместо [[
, как упоминал @Frank о разнице в length
принимаемом входном аргументе ( [[
— работает с длиной 1, в то время как [
работает для 1 или более), и сопоставить имена ‘x’, преобразовав ‘k’ в character
класс и получить значения из ‘x’ для создания ‘k2’ (предполагая, что мы хотим, чтобы значения соответствовали именам, а не основывались на числовом индексе)
df %>%
mutate(k2 = x[as.character(k)])
Комментарии:
1. Извините — я намеревался использовать =, а не <- . Я буду редактировать вопрос — я предполагаю, что ответ будет по простой причине @Frank, упомянутой выше.
2. @radmuzom Да,
[[
будет работать только для длины 1, и наряду с этим ‘k’ является числовым индексом. Если вы хотите сопоставить имена ‘x’, которые являются символьными, это должно быть ‘character3. Спасибо. Не могли бы вы, пожалуйста, отредактировать свой ответ? Это больше не подходит после редактирования вопроса.