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

Posted

技术标签:

【中文标题】基于存储为R w / dplyr mutate()中的向量的列索引连接data.frame字符列?【英文标题】:Concatenate data.frame character columns based on column index stored as a vector in R w/ dplyr mutate()? 【发布时间】:2019-05-18 22:36:21 【问题描述】:

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

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

例如: 假设我想在使用 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"

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

根据 Akrun 发现的错字进行编辑 借用 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】:

我们可以通过连接 (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" 

第二个元素是NA str_c

【讨论】:

以上是关于基于存储为R w / dplyr mutate()中的向量的列索引连接data.frame字符列?的主要内容,如果未能解决你的问题,请参考以下文章

R语言dplyr包使用case_when函数和mutate函数生成新的数据列实战:基于单列生成新的数据列基于多列生成新的数据列

R语言dplyr包为dataframe添加数据列实战( Add Columns):基于mutate()函数添加一个或者多个数据列(尾部添加头部添加条件生成某个具体数据列的前后)

在 R 中:将列名作为参数传递,并在 dplyr::mutate() 和 lazyeval::interp() 的函数中使用它

如何在 R 中使用 dplyr mutate 函数来计算运行余额?

R dplyr mutate 条件 when_case 无法更新数据帧

R语言dplyr包使用mutate函数生成新的数据列(不改变原数据列)实战