将字符串和数据框转换为另一个数据框

Convert character string and data frame into another data frame

提问人:jcorn427 提问时间:10/27/2023 最后编辑:jcorn427 更新时间:10/28/2023 访问量:48

问:

我有一个单行数据框,如下所示:

            Donor  Treatment Timepoint
  MK434_016   WT5 ST002_50uM       6hr

还有一个字符串,如下所示:

[1] "AAACAAGCAAACAAGAATTCGGTT-1" "AAACAAGCAAACAATCATTCGGTT-1" "AAACAAGCAAACCTGAATTCGGTT-1" "AAACAAGCAAACTTGGATTCGGTT-1"
[5] "AAACAAGCAAAGACCCATTCGGTT-1" "AAACAAGCAAAGGTAAATTCGGTT-1"

我想将两者合并以创建一个如下所示的数据框:

                           Donor  Treatment Timepoint
AAACAAGCAAACAAGAATTCGGTT-1   WT5 ST002_50uM       6hr
AAACAAGCAAACAATCATTCGGTT-1   WT5 ST002_50uM       6hr
AAACAAGCAAACCTGAATTCGGTT-1   WT5 ST002_50uM       6hr
etc...

我尝试使用 rbind() 或 paste() 以几种不同的方式合并它们,但不知道如何获得我正在寻找的完整数据帧。

R 生物信息学 修拉

评论

0赞 Lucca Nielsen 10/27/2023
目前尚不清楚数据集和字符串之间的关系。要绑定行,您需要类似的结构,要连接为新列,您需要在两个列上都有一个匹配的列 (id)。试着更好地解释这些关系。
1赞 jcorn427 10/27/2023
我正在尝试创建一个数据框,该数据帧每行的数据与 1 行数据框的数据相同,只是使用行名的各种单元格条形码。
0赞 Chris 10/27/2023
欢迎来到 stackpverflow。看起来您只想将您的 ,从 MK_434_016 替换为相应的 AAA 等。所以rownames(rownames(my_transplant_df) <- my_string_vector_cell_barcodes
1赞 Gregor Thomas 10/27/2023
首先,您需要重复 1 行数据框,使其具有与字符串中一样多的行数,然后需要将行名设置为字符串 .your_df = your_df[rep(1, length(your_char_string)), ]rownames(your_df) = your_char_string

答:

3赞 r2evans 10/27/2023 #1

我将首先将它们连接在一起,而不使用行名,因为有些工具支持它们,有些工具会忽略它们,有些工具会主动删除它们。

df2 <- cbind(df1[rep(1, length(strings)),], data.frame(barcode = strings))
df2
#             Donor  Treatment Timepoint                    barcode
# MK434_016     WT5 ST002_50uM       6hr AAACAAGCAAACAAGAATTCGGTT-1
# MK434_016.1   WT5 ST002_50uM       6hr AAACAAGCAAACAATCATTCGGTT-1
# MK434_016.2   WT5 ST002_50uM       6hr AAACAAGCAAACCTGAATTCGGTT-1
# MK434_016.3   WT5 ST002_50uM       6hr AAACAAGCAAACTTGGATTCGGTT-1
# MK434_016.4   WT5 ST002_50uM       6hr AAACAAGCAAAGACCCATTCGGTT-1
# MK434_016.5   WT5 ST002_50uM       6hr AAACAAGCAAAGGTAAATTCGGTT-1

从这里开始,如果你真的想从列中删除信息并使它们成为行名,这很简单:barcode

rownames(df2) <- df2$barcode
df2$barcode <- NULL
df2
#                            Donor  Treatment Timepoint
# AAACAAGCAAACAAGAATTCGGTT-1   WT5 ST002_50uM       6hr
# AAACAAGCAAACAATCATTCGGTT-1   WT5 ST002_50uM       6hr
# AAACAAGCAAACCTGAATTCGGTT-1   WT5 ST002_50uM       6hr
# AAACAAGCAAACTTGGATTCGGTT-1   WT5 ST002_50uM       6hr
# AAACAAGCAAAGACCCATTCGGTT-1   WT5 ST002_50uM       6hr
# AAACAAGCAAAGGTAAATTCGGTT-1   WT5 ST002_50uM       6hr

快速版本:dplyr

library(dplyr)
df1[rep(1, length(strings)),] %>%
  `rownames<-`(NULL) %>%
  mutate(barcode = strings) %>%
  tibble::column_to_rownames("barcode")
#                            Donor  Treatment Timepoint
# AAACAAGCAAACAAGAATTCGGTT-1   WT5 ST002_50uM       6hr
# AAACAAGCAAACAATCATTCGGTT-1   WT5 ST002_50uM       6hr
# AAACAAGCAAACCTGAATTCGGTT-1   WT5 ST002_50uM       6hr
# AAACAAGCAAACTTGGATTCGGTT-1   WT5 ST002_50uM       6hr
# AAACAAGCAAAGACCCATTCGGTT-1   WT5 ST002_50uM       6hr
# AAACAAGCAAAGGTAAATTCGGTT-1   WT5 ST002_50uM       6hr

数据

df1 <- structure(list(Donor = "WT5", Treatment = "ST002_50uM", Timepoint = "6hr"), class = "data.frame", row.names = "MK434_016")
strings <- c("AAACAAGCAAACAAGAATTCGGTT-1", "AAACAAGCAAACAATCATTCGGTT-1", "AAACAAGCAAACCTGAATTCGGTT-1", "AAACAAGCAAACTTGGATTCGGTT-1", "AAACAAGCAAAGACCCATTCGGTT-1", "AAACAAGCAAAGGTAAATTCGGTT-1")

评论

0赞 jcorn427 10/27/2023
这效果很好!谢谢。复制 df 以等于我的字符串的长度是我所缺少的。
1赞 Andre Wildberg 10/27/2023
旁注,您可以通过使用 代替 来简化基本解决方案。data.frame(df1[rep(1, length(strings)),], row.names=strings)data.framecbind
2赞 thelatemail 10/27/2023
这也是一个合并操作——merge(df1, list(barcode=strings), by=NULL)
1赞 IceCreamToucan 10/28/2023 #2

使用数据,如@r2evans的答案

library(dplyr)

df1 %>% 
  reframe(barcode = strings, across(everything()))
#>                      barcode Donor  Treatment Timepoint
#> 1 AAACAAGCAAACAAGAATTCGGTT-1   WT5 ST002_50uM       6hr
#> 2 AAACAAGCAAACAATCATTCGGTT-1   WT5 ST002_50uM       6hr
#> 3 AAACAAGCAAACCTGAATTCGGTT-1   WT5 ST002_50uM       6hr
#> 4 AAACAAGCAAACTTGGATTCGGTT-1   WT5 ST002_50uM       6hr
#> 5 AAACAAGCAAAGACCCATTCGGTT-1   WT5 ST002_50uM       6hr
#> 6 AAACAAGCAAAGGTAAATTCGGTT-1   WT5 ST002_50uM       6hr

创建于 2023-10-27 使用 reprex v2.0.2