连接数据.基于列索引的帧字符列存储为R w/dplyr mutate()中的矢量



是否可以基于存储为向量的列索引来连接数据帧列,可能使用stringr函数(例如str_c(((或粘贴?然后,我如何使用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

列名是什么?

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"

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

根据Akrun发现的拼写错误进行编辑借用SO使用双括号创建(变异(新变量是有效的,但这可以单独明确地识别列,而不是使用数字向量来识别每个列索引。

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,

我们可以通过连接(str_c(将具有列索引(.[color_vec_num](和reduce的列子集设置为mutate中的单个列/向量

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]]))

话虽如此,与pasteunite(来自tidyr(相比,使用str_c在缺失值方面具有明显的优势。对于str_c,列中任何缺失的值都会返回整行的NA,而pasteunite会将NA转换为字符并返回类似的内容

"NA gold yellow" 

对于第二个元素,而对于str_cNA

最新更新