【问题标题】:Writing out group_by with length > 1 to individual text files in R将长度大于 1 的 group_by 写入 R 中的单个文本文件
【发布时间】:2021-07-21 12:37:06
【问题描述】:

抱歉,我仍然熟悉 dplyr 和 data.table 的世界,并试图弄清楚它的全部功能!

我有一个数据集,我有兴趣在其中对特定变量(轨迹)进行分组:

DF <- structure(list(Gene = c("GeneA", "GeneB", "GeneC", "GeneD", "GeneE"), 
                Locus = c("1","2","2","3","3"),
                Chromosome = c("1","1","1","1","1"),
                Start = c("100","500","600","1000","1500"),
                Stop = c("200","550","700","1400","1750")),
                .Names = c("Gene","Locus","Chromosome","Start","Stop"), 
                row.names = c(NA, 5L), 
                class = "data.frame")

> DF
   Gene Locus Chromosome Start Stop
GeneA     1          1   100  200
GeneB     2          1   500  550
GeneC     2          1   600  700
GeneD     3          1  1000 1400
GeneE     3          1  1500 1750

我想知道在基因座列有多个值的情况下,是否可以写出包含来自 Gene、Chromosome、Start、Stop 列的值的“每个基因座”文件。所以 Locus==1 不会写出任何文本文件,但是 Locus==2 和 Locus==3 的 Gene 列中的值将被写入单个文件? 例如

<loc2.txt>
   Gene Chromosome Start Stop
GeneB           1   500  550
GeneC           1   600  700

<loc3.txt>
   Gene Chromosome Start Stop
GeneD           1  1000 1400
GeneE           1  1500 1750

提前感谢您的帮助!

【问题讨论】:

  • 您的 structure 最后似乎缺少一个括号,并且似乎与您的示例输出不匹配。您能否编辑您的问题或澄清这一点?
  • 补充上述内容 - 您可能有一个轻微的错字 - 在DF 中,GeneC 的对应基因座是 3(第 3 行),但在 DF2 中它是 2。该值应该是是 2 还是 3?
  • 已修复!抱歉,这是我在问题创建页面和 R 终端之间调整数据的结果!

标签: r dplyr data.table data-management


【解决方案1】:

dplyr

library(dplyr)
newDF <- DF %>%
  group_by(Locus) %>%
  filter(n() > 1) %>%
  nest_by()
newDF
# # A tibble: 2 x 2
# # Rowwise:  Locus
#   Locus               data
#   <chr> <list<tbl_df[,4]>>
# 1 2                [2 x 4]
# 2 3                [2 x 4]
mapply(function(x, nm) write.csv(x, nm),
       newDF$data, paste0("loc", newDF$Locus, ".csv"))
# [[1]]
# NULL
# [[2]]
# NULL

文件在当前目录中创建。您可以放心地忽略来自mapplyNULL 输出。

data.table

library(data.table)
DT <- as.data.table(DF)
newDT <- DT[, .SD[.N > 1, .(data = list(.SD))], by = Locus]
newDT
#     Locus              data
#    <char>            <list>
# 1:      2 <data.table[2x4]>
# 2:      3 <data.table[2x4]>
mapply(function(x, nm) write.csv(x, nm),
       newDF$data, paste0("loc", newDF$Locus, ".csv"))

【讨论】:

  • 啊,太棒了,谢谢!很抱歉尝试进一步窥探英特尔,但我应用它的数据框实际上有几列我想写出(基因、染色体、开始、停止)。有没有办法修改它,使其不仅提取一个变量?超越目前的情况,知道如何获取不仅仅是基因列将非常有用。再次感谢!
  • 您说要将这些行写入文本文件。相反,您的意思是将data.frame 写入CSV 之类的吗?请使用更相关的示例数据编辑您的原始问题。
  • 一般来说,code-golf 将代码缩短为尽可能少的字符。甚至还有codegolf.stackexchange.com。有时它会产生非常易读的代码,并且经常使用特定于语言的技巧,这些技巧违反直觉,鲜为人知或解析器中的“功能”(错误),从而过度简化到混淆和晦涩的程度。 (最后......对于这个答案并不重要:-)
  • 很抱歉我混淆了write.csvwrite.table。否则,答案是否解决了您的问题?
  • 啊!惊人的!谢谢,我会检查那个codegolf链接。我确实喜欢这样的东西(我经常使用 awk 来进行数据管理,并且总是对你能获得这么短的代码感到惊讶)。但如果是我与其他人共享的代码,我倾向于犯冗长的错误,这样他们就知道我到底在说什么哈哈。再次感谢您的所有帮助,非常感谢:D
猜你喜欢
  • 2015-02-28
  • 2021-09-21
  • 1970-01-01
  • 1970-01-01
  • 2021-04-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多