是否可以根据存储为向量的列索引来连接数据帧列,可能使用字符串函数(例如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,
答案 0 :(得分:1)
我们可以通过串联(.[color_vec_num]
)
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
(来自unite
)相比,使用tidyr
在缺失值方面有明显的优势。使用str_c
时,一列中的所有缺失值都会返回整行的NA
,而paste
或unite
会将NA
转换为字符并返回类似的内容>
"NA gold yellow"
对于第二个元素,对于NA
,它为str_c