通过其他列因子汇总列

如何解决通过其他列因子汇总列

我有一些数据,其中包含单个物种及其在每个样本中的计数。每个物种还以其营养模式标记。看起来像这样:

OTU_ID Trophic.Mode  Sample1 Sample2 Sample3 Sample4
 gatca   Symbiotroph   4         5      6      1
 atca    Pathotroph    4         3      4      4
 gatac   Pathotroph    7         1      2      1

以此类推,它有2700行,带有标记其营养模式的物种计数。 我想聚合数据,以便按Trophic.Mode列(具有5个因素,所以我希望有5行的数据框)对每个样本建立一个更简单的功能社区,从而最终得到这个:

Trophic.Mode  Sample1 Sample2 Sample3 Sample4
  Symbiotroph   4         5      6      1
  Pathotroph    13        18     15     11

因此,我使用了以下代码:

agg = aggregate(data,by = list(data$Trophic.Mode),FUN = sum)

这只会返回错误

"Error in Summary.factor(c(1L,2L,3L,4L,5L,6L,7L,8L,9L,10L,11L,: 
  ‘sum’ not meaningful for factors

但是我不确定我是否理解-我想根据这些因素对其他列求和。

解决方法

我更喜欢将公式语法用于聚合,因为该公式右侧的分组列将自动从摘要中省略:

aggregate(. ~ Trophic.Mode,data = data[-1],FUN = sum)

如果您要对数据中不是列的内容进行分组,则带有by的非公式接口最有用。

,

我想通过这些因素求和其他列。

这是rowsum的作用:

rowsum(data[,-(1:2)],data$Trophic.Mode)
#R>             Sample1 Sample2 Sample3 Sample4
#R> Pathotroph       11       4       6       5
#R> Symbiotroph       4       5       6       1

就击键和计算时间而言,这都是很难克服的:

# simulate your ~2700 row data set
set.seed(1)
n <- 2700L
sim_dat <- data.frame(
  Trophic.Mode = sample.int(5,n,replace = TRUE),sample       = matrix(sample.int(10,n * 4L,n))
colnames(sim_dat)[-1] <- paste0("sample",1:4)
head(sim_dat,3)
#R>   Trophic.Mode sample1 sample2 sample3 sample4
#R> 1            1       9       6       9       6
#R> 2            4       1       6       3       1
#R> 3            1       9       9      10       9

# check that we get the same
r1 <- aggregate(. ~ Trophic.Mode,data = sim_dat,FUN = sum)
r2 <- rowsum(sim_dat[,-1],sim_dat$Trophic.Mode)
all.equal(r1[,r2,check.attributes = FALSE)
#R> [1] TRUE

library(tidyverse)
r3 <- sim_dat %>% 
  group_by(Trophic.Mode) %>%
  summarise_all(sum) %>%
  ungroup()
all.equal(r3[,check.attributes = FALSE)
#R> [1] TRUE

# check the computation time
bench::mark(
  aggregate = aggregate(. ~ Trophic.Mode,FUN = sum),rowsum    = rowsum(sim_dat[,sim_dat$Trophic.Mode),tidy      = sim_dat %>% 
    group_by(Trophic.Mode) %>%
    summarise_all(sum) %>%
    ungroup(),min_time = 2,check = FALSE)
#R> # A tibble: 3 x 13
#R>   expression      min   median `itr/sec` mem_alloc `gc/sec` n_itr  n_gc total_time 
#R>   <bch:expr> <bch:tm> <bch:tm>     <dbl> <bch:byt>    <dbl> <int> <dbl>   <bch:tm> 
#R> 1 aggregate    2.28ms   2.45ms      396.    1.37MB    17.4    612    27      1.55s 
#R> 2 rowsum     110.93µs  129.8µs     7449.   53.23KB    11.2   9985    15      1.34s 
#R> 3 tidy         3.49ms   4.63ms      209.   93.41KB     6.56   383    12      1.83s

这几乎比其他方法快20倍,但是从几毫秒开始就没有...

更新

根据要求,这是具有n <- 500000L(500k行)且没有ungroup的基准:

bench::mark(
  aggregate = aggregate(. ~ Trophic.Mode,tidy      = sim_dat %>% 
    group_by(Trophic.Mode) %>%
    summarise_all(sum),check = FALSE)
#R> # A tibble: 3 x 13
#R>   expression      min   median `itr/sec` mem_alloc `gc/sec` n_itr  n_gc total_time 
#R>   <bch:expr> <bch:tm> <bch:tm>     <dbl> <bch:byt>    <dbl> <int> <dbl>   <bch:tm> 
#R> 1 aggregate   203.5ms  264.5ms      3.64  234.56MB     25.5     8    56      2.19s 
#R> 2 rowsum         11ms   11.2ms     84.8     7.82MB     14.0   170    28         2s 
#R> 3 tidy         12.8ms   13.4ms     64.8    17.36MB     25.9   130    52         2s

,对于n <- 10000000L(10M):

bench::mark(
  aggregate = aggregate(. ~ Trophic.Mode,min_time = 30,check = FALSE)
#R>   expression      min   median `itr/sec` mem_alloc `gc/sec` n_itr  n_gc total_time 
#R>   <bch:expr> <bch:tm> <bch:tm>     <dbl> <bch:byt>    <dbl> <int> <dbl>   <bch:tm> 
#R> 1 aggregate     5.82s    5.92s     0.168    5.05GB    2.18      6    78      35.8s 
#R> 2 rowsum     275.46ms 285.37ms     3.41   204.29MB    0.796   103    24      30.2s 
#R> 3 tidy       233.38ms 264.47ms     3.66   331.03MB    2.03    110    61      30.1s

事实证明,较大的数据集几乎没有什么区别。

,
library(tidyverse)

df %>% 
select(-OTU_ID) %>%
group_by(Trophic.Mode) %>%
summarise_all(sum) %>%
ungroup()

我的偏好是tidyverse

,

也许尝试此选项。这是一个base R选项。正如 @GregorThomas 在评论中所说,您必须告诉函数必须考虑哪些变量。在这种情况下,我们在公式中避免使用OTU_ID。这里的代码:

#Option 1
Out1 <- aggregate(cbind(Sample1,Sample2,Sample3,Sample4)~Trophic.Mode,data=df,sum,na.rm=T)

输出:

  Trophic.Mode Sample1 Sample2 Sample3 Sample4
1   Pathotroph      11       4       6       5
2  Symbiotroph       4       5       6       1

使用了一些数据:

#Data
df <- structure(list(OTU_ID = c("gatca","atca","gatac"),Trophic.Mode = c("Symbiotroph","Pathotroph","Pathotroph"),Sample1 = c(4L,4L,7L),Sample2 = c(5L,3L,1L),Sample3 = c(6L,2L),Sample4 = c(1L,1L)),class = "data.frame",row.names = c(NA,-3L))
,

尝试这个

library(dplyr)
read_table("TU_ID  Trophic.Mode  Sample1 Sample2 Sample3 Sample4
  gatca   Symbiotroph   4         5      6      1
  atca    Pathotroph    4         3      4      4
  gatac   Pathotroph    7         1      2      1") %>% 
   group_by(Trophic.Mode) %>% 
   summarise(across(where(is.numeric),sum))

`summarise()` ungrouping output (override with `.groups` argument)
# A tibble: 2 x 5
  Trophic.Mode Sample1 Sample2 Sample3 Sample4
  <chr>          <dbl>   <dbl>   <dbl>   <dbl>
1 Pathotroph        11       4       6       5
2 Symbiotroph        4       5       6       1
,

请考虑一下aggregate的公式版本,因为您可以显式地看到数字和分组列,因此可以更容易阅读。但是您可能仍需要过滤公式列。

也请注意aggregate公式与非公式方法在处理缺失值方面可能有所不同。参见aggregate methods treat missing values (NA) differently。 @Rorschach的fix在下面应用。

# EXPLICIT NUMERIC COLUMNS
agg <- aggregate(cbind(Sample1,Sample4) ~ Trophic.Mode,data = data,FUN = sum,na.rm = TRUE,na.action = na.pass)

# IMPLICIT "ALL" NUMERIC COLUMNS
agg <- aggregate(. ~ Trophic.Mode,data = data[,grep("Trophic|Sample",names(data))],na.action = na.pass)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res