Можно ли объединить столбцы фрейма данных на основе индекса столбца, хранящегося в виде вектора, возможно, используя функцию stringr (например, str_c ()) или paste?И затем, как я могу сделать это, чтобы создать новую переменную, используя dplyr mutate ()?
Я хотел бы сделать это для задачи агрегирования электронной почты, которая будет означать чтение листов Excel, содержащих столбцы с разными именами (например, простоодин столбец Имя, а иногда и Имя и Фамилия), используя пакет readxl.
Например: скажем, я хотел объединить все имена столбцов, содержащих «color», во фрейме данных starwars, установленном с пакетом tidyverse R.
library(tidyverse)
colnames(starwars)
[1] "name" "height" "mass" "hair_color" "skin_color" "eye_color" "birth_year" "gender" "homeworld" "species" "films"
[12] "vehicles" "starships"
Я мог бы захватить индекс этих столбцов с помощью:
color_vec_num <- which(grepl("COLOR", toupper(colnames(starwars))))
print(color_vec_num)
[1] 4 5 6
Что такое имена столбцов?
colnames(starwars)[color_vec_num]
[1] "hair_color" "skin_color" "eye_color"
Я могу связать эти столбцы вместеимена достаточно легко по имени.Глядя на первые 4 строки звездных войн:
str_c(starwars$hair_color, starwars$skin_color, starwars$eye_color)[1:4]
[1] "blondfairblue" NA NA "nonewhiteyellow"
Однако мои попытки использовать индекс столбцов не увенчались успехом.
Редактировать в соответствии с обнаружением Акруном опечатки Заимствованиеэто ТАК использование двойных скобок для создания (изменения) новой переменной работает, но это идентифицирует столбцы в единственном и явном виде, вместо использования числового вектора для идентификации индекса каждого столбца.
starwars %>% mutate(newcolor = paste(.[[4]],.[[5]], .[[6]])) %>% select(name, newcolor)
# A tibble: 87 x 2
name newcolor
<chr> <chr>
1 Luke Skywalker blond fair blue
2 C-3PO NA gold yellow
3 R2-D2 NA white, blue red
Эта попытка, напоминающая предыдущий ответ SO на другой вопрос , явно не выглядит правильной.
paste(starwars %>% select(color_vec_num), collapse = " ", stringsAsFactors = FALSE)
[1] "c(\"blond\", NA, NA, \"none\", \"brown\", \"brown, grey\", \"brown\", NA, \"black\", \"auburn, white\", \"blond\", \"auburn, grey\", \"brown\", \"brown\", NA, NA,