根据作为索引存储在R w / dplyr mutate()中的列的索引连接data.frame字符列?

时间:2018-12-18 13:34:00

标签: r dplyr

是否可以根据存储为向量的列索引来连接数据帧列,可能使用字符串函数(例如str_c())或粘贴?然后,如何使用dplyr mutate()创建一个新变量?

对于电子邮件聚合任务,我想这样做,这意味着要使用readxl包阅读包含不同名称列(例如,一个Name列,有时还包括名字和姓氏)的Excel工作表。

例如: 假设我想将与tidyverse R软件包一起安装的starwars数据框中的所有包含“颜色”的列名称连接起来。

 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"

我可以按名称轻松地将这些列名称链接在一起。查看前四行的《星球大战》:

str_c(starwars$hair_color, starwars$skin_color, starwars$eye_color)[1:4]
[1] "blondfairblue"   NA                NA                "nonewhiteyellow"

但是,我使用列索引的尝试失败了。

根据阿克伦发现的错字进行编辑借用此SO use of double brackets来创建(变异)新变量是可行的,但这会单数且显式地标识列,而不是使用数字矢量来标识每一个列索引。

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   

这种尝试让人想起previous SO answer for a different question,显然看起来不正确。

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 :(得分:1)

我们可以通过串联(.[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_cpaste(来自unite)相比,使用tidyr在缺失值方面有明显的优势。使用str_c时,一列中的所有缺失值都会返回整行的NA,而pasteunite会将NA转换为字符并返回类似

"NA gold yellow" 

对于第二个元素,对于NA,它为str_c