基于列索引连接data.frame字符列,列索引存储为R w/dplyr mutate()中的向量?

基于列索引连接data.frame字符列,列索引存储为R w/dplyr mutate()中的向量?,r,dplyr,R,Dplyr,可以使用stringr函数(例如str_c())或paste,基于存储为向量的列索引连接数据帧列吗?然后,如何使用dplyr mutate()创建新变量 对于电子邮件聚合任务,我希望这样做,这意味着使用readxl包阅读包含不同名称列(例如,只有一个名称列,有时还有名字和姓氏)的Excel工作表 例如: 假设我想连接tidyverse R软件包安装的starwars数据框中包含“color”的所有列名 library(tidyverse) colnames(starwars) [1] "n

可以使用stringr函数(例如str_c())或paste,基于存储为向量的列索引连接数据帧列吗?然后,如何使用dplyr mutate()创建新变量

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

例如: 假设我想连接tidyverse R软件包安装的starwars数据框中包含“color”的所有列名

 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
我可以很容易地按名称将这些列名链接在一起。看看《星球大战》的前4排:

str_c(starwars$hair_color, starwars$skin_color, starwars$eye_color)[1:4]
[1] "blondfairblue"   NA                NA                "nonewhiteyellow"
但是,我尝试使用列索引失败

Edit per Akrun发现了一个错误,借用它来创建(变异)一个新变量,但这可以单独明确地标识列,而不是使用数字向量来标识每个列索引

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   

我们可以使用列索引(
[color\u vec\u num]
)将列子集,并通过连接(
str\u c
)将其减少为
mutate
中的单个列/向量

最后一个缺少
,即它应该是

starwars %>%
   mutate(newcolor = paste(.[[4]],.[[5]], .[[6]]))
话虽如此,与
粘贴
联合
(来自
tidyr
)相比,使用
stru_c
对于缺失值有明显的优势。使用
stru_c
,列中任何缺失的值都会返回整行的
NA
,而
paste
unite
会将
NA
转换为字符并返回类似的值

"NA gold yellow" 
对于第二个元素,当它是
NA
时,对于
stru c

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