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 中的向量的主要内容,如果未能解决你的问题,请参考以下文章

如何将 varchar 列值转换为 int?

PHP之string之str_split()函数使用

将日期时间列值批量转换和更新为 UNIX 时间戳?

在熊猫数据框中将纪元列值转换为时间

R语言使用str_split函数和str_split_fixed函数将字符串分割(分裂split)成几个部分:str_split函数使用指定的字符或者字符串分割字符串str_split_fixed

将时间戳转换为特定时区然后在 bigquery 中将其转换为日期时出现问题