str_split 用于列值,然后将其转换为 R 中的向量
Posted
技术标签:
【中文标题】str_split 用于列值,然后将其转换为 R 中的向量【英文标题】:str_split for column values and then turn it into vector in R 【发布时间】:2022-01-22 10:25:21 【问题描述】:这有点类似于我之前的问题Split data frame string column and count items. (dplyr and R) ,但我想知道的是如何拆分列项并将返回值转换为向量而不是列表。
library("tidyverse")
dat <- data.frame(ID = c("A", "B"),
gene_ids = c(
"101739/20382/13006/212377/114714/66622/140917",
"75717/103573/14852/18141/12567/26429/20842/17975/12545"
)
)
tmp <- dat %>% mutate(ids = str_split(gene_ids, "/"))
tmp$ids
#> [[1]]
#> [1] "101739" "20382" "13006" "212377" "114714" "66622" "140917"
#>
#> [[2]]
#> [1] "75717" "103573" "14852" "18141" "12567" "26429" "20842" "17975"
#> [9] "12545"
tmp
#> ID gene_ids
#> 1 A 101739/20382/13006/212377/114714/66622/140917
#> 2 B 75717/103573/14852/18141/12567/26429/20842/17975/12545
#> ids
#> 1 101739, 20382, 13006, 212377, 114714, 66622, 140917
#> 2 75717, 103573, 14852, 18141, 12567, 26429, 20842, 17975, 12545
dat %>% mutate(please_be_vector = str_split(gene_ids, "/") %>% unlist())
#> Error: Problem with `mutate()` input `please_be_vector`.
#> x Input `please_be_vector` can't be recycled to size 2.
#> ℹ Input `please_be_vector` is `str_split(gene_ids, "/") %>% unlist()`.
#> ℹ Input `please_be_vector` must be size 2 or 1, not 16.
我希望 tmp$ids
成为向量而不是像下面这样的列表。这可以使用 dplyr 吗?
tmp$ids[1]
"101739" "20382" "13006" "212377" "114714" "66622" "140917"
tmp$ids[2]
"75717" "103573" "14852" "18141" "12567" "26429" "20842" "17975" "12545"
有可能吗?
【问题讨论】:
【参考方案1】:我们可以将函数循环应用到unlist
列,以获得向量列表。
library(dplyr)
dat %>%
separate_rows(everything(), sep = "/")%>%
pivot_wider(names_from = ID, values_from = gene_ids, values_fn = list)%>%
lapply(unlist)
$A
[1] "101739" "20382" "13006" "212377" "114714" "66622" "140917"
$B
[1] "75717" "103573" "14852" "18141" "12567" "26429" "20842" "17975" "12545"
【讨论】:
【参考方案2】:更新: 也许是这个:
dat %>%
separate_rows(gene_ids) %>%
arrange(ID, gene_ids) %>%
group_by(ID) %>%
mutate(id = row_number()) %>%
pivot_wider(
names_from = ID,
values_from = gene_ids
) %>%
pull(A) # alternative pull(B)
[1] "101739" "114714" "13006" "140917" "20382" "212377" "66622" NA
[9] NA
第一个答案:
library(tidyverse)
dat %>% mutate(ids = str_split(gene_ids, "/")) %>%
unnest(ids) %>%
pull(ids)
输出:
[1] "101739" "20382" "13006" "212377" "114714" "66622" "140917" "75717"
[9] "103573" "14852" "18141" "12567" "26429" "20842" "17975" "12545"
或:
temp <- dat %>% mutate(ids = str_split(gene_ids, "/"))
unlist(tmp$ids)
输出:
[1] "101739" "20382" "13006" "212377" "114714" "66622" "140917" "75717"
[9] "103573" "14852" "18141" "12567" "26429" "20842" "17975" "12545
【讨论】:
所需的输出不是单个字符向量。 请看我的更新。 感谢代码! 现在有了 GuedesBF 的回答,我明白你想要什么。unclass
是解决方案。但无论如何,我的代码的第一部分可能会有所帮助。【参考方案3】:
tmp$ids
是一个包含两个字符向量的列表,每个字符向量对应一个数据行。当您使用[
对列表进行子集化时,您会得到一个列表。而是使用[[
:
> tmp$ids[[1]]
[1] "101739" "20382" "13006" "212377" "114714" "66622" "140917"
chapter on subsetting in Advanced R 是更好地理解这一点的好资源。
【讨论】:
感谢您的链接。我去看看。以上是关于str_split 用于列值,然后将其转换为 R 中的向量的主要内容,如果未能解决你的问题,请参考以下文章
R语言使用str_split函数和str_split_fixed函数将字符串分割(分裂split)成几个部分:str_split函数使用指定的字符或者字符串分割字符串str_split_fixed