基于存储为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]]))
话虽如此,与paste
或unite
(来自tidyr
)相比,使用str_c
在缺失值方面具有明显优势。使用str_c
,列中的任何缺失值都会为整行返回NA
,而paste
或unite
会将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 函数来计算运行余额?