Объединить символьные столбцы data.frame на основе индекса столбца, хранящегося как вектор в R w / dplyr mutate ()? - PullRequest
0 голосов
/ 18 декабря 2018

Можно ли объединить столбцы фрейма данных на основе индекса столбца, хранящегося в виде вектора, возможно, используя функцию 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,

1 Ответ

0 голосов
/ 18 декабря 2018

Мы можем подставить столбцы с индексом столбца (.[color_vec_num]) и reduce в один столбец / вектор в mutate путем объединения (str_c)

library(tidyverse)
out <- starwars %>%
           mutate(newcolor = reduce(.[color_vec_num], str_c))
out %>% 
   pull(newcolor) %>% 
   head(4)
#[1] "blondfairblue"   NA                NA                "nonewhiteyellow"

Относительно ошибки в OP paste

paste(.[[4]],.[[5]], [[6]]

последняя отсутствует ., то есть она должна быть

starwars %>%
   mutate(newcolor = paste(.[[4]],.[[5]], .[[6]]))

Сказав это, есть явное преимущество в использованииstr_c по сравнению с paste или unitetidyr) в отношении пропущенных значений.При str_c любое отсутствующее значение в столбце возвращает NA для всей строки, тогда как paste или unite преобразует NA в символ и возвращает что-то вроде

"NA gold yellow" 

для второйэлемент в то время как это NA для str_c

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...