【问题标题】:How to convert a data frame / tibble into named list of vectors如何将数据框/小标题转换为命名的向量列表
【发布时间】:2018-04-12 13:07:43
【问题描述】:

我有以下数据框:

library(tidyverse)
dat <- structure(list(seq_name = c("Peptide_set1.r1", "Peptide_set2.r1"
), peptide = c("KSKLRHGC", "AAYVYVNQF"
)), .Names = c("seq_name", "peptide"), row.names = c(NA, -2L), class = c("tbl_df", 
"tbl", "data.frame"))

dat
#> # A tibble: 2 x 2
#>   seq_name        peptide  
#>   <chr>           <chr>    
#> 1 Peptide_set1.r1 KSKLRHGC 
#> 2 Peptide_set2.r1 AAYVYVNQF

我想要做的是将它们转换成这个向量列表:

$Peptide_set1.r1
[1] "K" "S" "K" "L" "R" "H" "G" "C"


$Peptide_set2.r1
[[1] "A" "A" "Y" "V" "Y" "V" "N" "Q" "F"

我该怎么做?

【问题讨论】:

  • @RonakShah 谢谢。但不完全是。我需要 named 列表。
  • @RonakShah 没有。名字应该取自`seq-

标签: r tidyverse


【解决方案1】:

我们可以使用strsplit 分割每个字符的字符串,并使用setnames 分配名称

setNames(strsplit(dat$peptide, ""), dat$seq_name)

#$Peptide_set1.r1
#[1] "K" "S" "K" "L" "R" "H" "G" "C"

#$Peptide_set2.r1
#[1] "A" "A" "Y" "V" "Y" "V" "N" "Q" "F"

要使用列索引而不是名称,我们可以使用pull 将列值转换为向量,因为这是一个小标题

library(dplyr)
setNames(strsplit(pull(dat[2]), ""), pull(dat[1]))

#$Peptide_set1.r1
#[1] "K" "S" "K" "L" "R" "H" "G" "C"

#$Peptide_set2.r1
#[1] "A" "A" "Y" "V" "Y" "V" "N" "Q" "F"

我们也可以将它们完全添加到dplyr链操作中

library(tidyverse)
dat1 <- dat %>% mutate(new = setNames(strsplit(pull(dat[2]), ""), pull(dat[1])))

dat1$new
#$Peptide_set1.r1
#[1] "K" "S" "K" "L" "R" "H" "G" "C"

#$Peptide_set2.r1
#[1] "A" "A" "Y" "V" "Y" "V" "N" "Q" "F"

正如@thelatemail 评论的那样,我们可以使用[[ 而不是pull 来提取列

setNames(strsplit(dat[[2]], ""), dat[[1]])

【讨论】:

  • 谢谢。如何修改您的代码,使其采用列索引而不是名称,例如而不是dat$peptidedat$seq_name。我试过这个但失败了setNames(strsplit(as.list(dat[1]), ""), dat[2,])
  • setNames(strsplit(dat[[2]], ""), dat[[1]]) 也可以工作,因为[[ 是用于从列表中提取的 R 原始操作,tbl 仍然在所有这些层之下。 pull 应该替换 [[ 所以语法实际上应该是 pull(dat, 2) 否则你调用 [ 然后 [[
  • @thelatemail 我忘了[[,也感谢pull 的解释。 :)
猜你喜欢
  • 2016-08-29
  • 2018-01-09
  • 2013-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-25
相关资源
最近更新 更多