草庐IT

R/data.table:分隔列并计算出现次数

codeneng 2023-03-28 原文

R/data.table: separate columns and count occurrences

我有一个很大的 data.table(这里只显示五行)。

1
2
3
4
5
6
 taxpath                                                                                                                  N
                  Bacteroidetes; Flavobacteriia; Flavobacteriales; Flavobacteriaceae; Formosa; Formosa sp. Hel3_A1_48;   57
 Bacteroidetes; Flavobacteriia; Flavobacteriales; Cryomorphaceae; NA; Cryomorphaceae bacterium BACL29 MAG-121220-bin8;   54
                Proteobacteria; Alphaproteobacteria; Pelagibacterales; Pelagibacteraceae; Candidatus Pelagibacter; NA;   53
                                                    Proteobacteria; Alphaproteobacteria; Pelagibacterales; NA; NA; NA;   41
                                                      Planctomycetes; NA; NA; NA; NA; Planctomycetes bacterium TMED84;   41

第一列是taxpath(门、纲、目、科、属、种从左到右),第二列是N,每条税路出现的频率。

我想做的是用分号分隔每个税路并使用第一个条目。

我想计算每个门等级(第一等级,即拟杆菌门、变形菌门或平面霉菌门)出现的频率。但是,此数字应乘以 N 列中的值。

所以,我所期望的或多或少是这样的。

1
2
3
4
phylum           Nnew
Bacteriodetes    111
Proteobacteria   94
Planctomycetes   41

你能帮我如何在列中进行拆分,并且 - 我想 - group-by 与列 N 相乘吗?

(PS:稍后,我也想对列 taxpath 中的其他元素也这样做,但我认为将其分配到单独的表中更容易)

  • 问题的第二部分不清楚。你能显示预期
  • 例如,Proteobacteria 出现在两行(第 3 行和第 8 行)中。第 3 行的值为 53,第 8 行的值为 41。我期望的输出是 column phylum 具有条目 proteobacteria,而 Nnew 列的值为 94(53 41)。清楚我的意思吗?
  • 你能检查更新的代码吗
  • 根据示例,我得到 Bacteriodetes 为 326
  • 谢谢,我已将输入数据缩短为 5 行而不是 10 行。
  • 没问题,我的输出是基于你之前展示的 10 行
  • 太好了,非常感谢。


这个标记为 data.table 所以这里是一个简单的 data.table 解决方案。

1
2
3
4
5
6
library(data.table)
DT[, .(Nnew = sum(N)), by = sub(";.*","", taxpath)]
#               sub Nnew
# 1:  Bacteroidetes  111
# 2: Proteobacteria   94
# 3: Planctomycetes   41

我们在 by 语句中动态提取 taxpath 的第一部分时基本上对 N 求和

数据

1
2
3
4
5
6
DT <- fread("taxpath\\t                                                                                                                  N
            Bacteroidetes; Flavobacteriia; Flavobacteriales; Flavobacteriaceae; Formosa; Formosa sp. Hel3_A1_48;\\t   57
            Bacteroidetes; Flavobacteriia; Flavobacteriales; Cryomorphaceae; NA; Cryomorphaceae bacterium BACL29 MAG-121220-bin8;\\t   54
            Proteobacteria; Alphaproteobacteria; Pelagibacterales; Pelagibacteraceae; Candidatus Pelagibacter; NA;\\t   53
            Proteobacteria; Alphaproteobacteria; Pelagibacterales; NA; NA; NA;\\t   41
            Planctomycetes; NA; NA; NA; NA; Planctomycetes bacterium TMED84;\\t   41")

我们可以用separate将\\'taxpath\\'根据分隔符;拆分成指定列,按\\'phylum\\'分组,得到\\'N\\'的sum

1
2
3
4
5
6
7
8
9
10
11
12
13
library(tidyverse)
newcols <-c("phylum","class","order","family","genus","species")
df1 %>%
   mutate(taxpath = sub(";$","", taxpath)) %>%
   separate(taxpath, into = newcols, sep=";\\\\s*") %>%
   group_by(phylum) %>%
   summarise(Nnew = sum(N))
# A tibble: 3 x 2
#   phylum          Nnew
#   <chr>          <int>
# 1 Bacteroidetes    326
# 2 Planctomycetes    41
# 3 Proteobacteria    94

有关R/data.table:分隔列并计算出现次数的更多相关文章

  1. ruby-on-rails - 使用一系列等级计算字母等级 - 2

    这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,

  2. ruby-on-rails - 更好的替代方法 try( :output). try( :data). try( :name)? - 2

    “输出”是一个序列化的OpenStruct。定义标题try(:output).try(:data).try(:title)结束什么会更好?:) 最佳答案 或者只是这样:deftitleoutput.data.titlerescuenilend 关于ruby-on-rails-更好的替代方法try(:output).try(:data).try(:name)?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.c

  3. ruby-on-rails - Prawn PDF : I need to generate nested tables - 2

    我需要一个表,其中行实际上是2行表,一个嵌套表是..我怎样才能在Prawn中做到这一点?也许我需要延期..但哪一个? 最佳答案 现在支持子表:Prawn::Document.generate("subtable.pdf")do|pdf|subtable=pdf.make_table([["sub"],["table"]])pdf.table([[subtable,"original"]])end 关于ruby-on-rails-PrawnPDF:Ineedtogeneratenested

  4. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  5. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  6. ruby - 使用 rbenv 和 ruby​​-build 构建 ruby​​ 失败,出现 undefined symbol : SSLv2_method - 2

    我正在尝试在配备ARMv7处理器的SynologyDS215j上安装ruby​​2.2.4或2.3.0。我用了optware-ng安装gcc、make、openssl、openssl-dev和zlib。我根据README中的说明安装了rbenv(版本1.0.0-19-g29b4da7)和ruby​​-build插件。.这些是随optware-ng安装的软件包及其版本binutils-2.25.1-1gcc-5.3.0-6gconv-modules-2.21-3glibc-opt-2.21-4libc-dev-2.21-1libgmp-6.0.0a-1libmpc-1.0.2-1libm

  7. ruby - 使用 Ruby,计算 n x m 数组的每一列中有多少个 true 的简单方法是什么? - 2

    给定一个nxmbool数组:[[true,true,false],[false,true,true],[false,true,true]]有什么简单的方法可以返回“该列中有多少个true?”结果应该是[1,3,2] 最佳答案 使用转置得到一个数组,其中每个子数组代表一列,然后将每一列映射到其中的true数:arr.transpose.map{|subarr|subarr.count(true)}这是一个带有inject的版本,应该在1.8.6上运行,没有任何依赖:arr.transpose.map{|subarr|subarr.in

  8. arrays - 计算数组中的匹配元素 - 2

    给定两个大小相等的数组,如何找到不考虑位置的匹配元素的数量?例如:[0,0,5]和[0,5,5]将返回2的匹配项,因为有一个0和一个5共同;[1,0,0,3]和[0,0,1,4]将返回3的匹配项,因为0有两场,1有一场;[1,2,2,3]和[1,2,3,4]将返回3的匹配项。我尝试了很多想法,但它们都变得相当粗糙和令人费解。我猜想有一些不错的Ruby习惯用法,或者可能是一个正则表达式,可以很好地回答这个解决方案。 最佳答案 您可以使用count完成它:a.count{|e|index=b.index(e)andb.delete_at

  9. ruby - 为什么 return 关键字会导致我的 'if block' 出现问题? - 2

    下面的代码工作正常:person={:a=>:A,:b=>:B,:c=>:C}berson={:a=>:A1,:b=>:B1,:c=>:C1}kerson=person.merge(berson)do|key,oldv,newv|ifkey==:aoldvelsifkey==:bnewvelsekeyendendputskerson.inspect但是如果我在“ifblock”中添加return,我会得到一个错误:person={:a=>:A,:b=>:B,:c=>:C}berson={:a=>:A1,:b=>:B1,:c=>:C1}kerson=person.merge(berson

  10. ruby - 安装 tiny_tds 在 mac os 10.10.5 上出现错误 - 2

    我正在使用macos,我想使用ruby​​驱动程序连接到sqlserver。我想使用tiny_tds,但它给出了缺少free_tds的错误,但它已经安装了。怎么能过这个?~brewinstallfreetdsWarning:freetds-0.91.112alreadyinstalled~sudogeminstalltiny_tdsBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtiny_tds:ERROR:Failedtobuildgemnativeextension.完整日志如下:/System

随机推荐