【问题标题】:Making a function to get percentage of multiple rows in dataframe R制作一个函数来获取数据框R中多行的百分比
【发布时间】:2021-06-12 13:07:55
【问题描述】:

我有一个包含数百个样本和数千个变量的数据框。但是这里我给出一个简单的数据框(my_data)作为说明。我想根据基因所属的集群(基因可以在多个集群中)获得变量相对于gene_count总和的百分比。我知道如何获取每个使用数据框操作的百分比。但是,由于我是编码新手,我正在尝试创建一个函数来获取百分比。谁能帮助如何使用我的函数(百分比)获得每个基因的百分比?结果将是“百分比”列上的百分比。非常感谢。

gene = c("CD63", "PTN", "MT2A", "PTGDS", "DBI", "TIMP1", "COX6C", "APLP2", "PTN", "GPC1")
gene_count = c(10, 15, 5, 15, 10, 25, 5, 5, 5, 5)
cluster = c(1,2, 3, 5, 7, 8, 9, 3, 6, 4 )
percent = c(0.1, 0.15, 0.5, 0.15, 0.1, 0.25, 0.05, 0.05, 0.05, 0.05)
my_data = data.frame(gene, gene_count, cluster, percent)
my_data


percent = function(gene, cluster){
for (gene in c(data$gene)){
if (data$gene == gene & data$cluster == cluster)
print(data$gene_count[which(data$gene == gene & data$cluster == cluster)]/sum(data$gene_count))
else print("Gene is not expressed in this cluster")
  }
}

【问题讨论】:

  • prop.table(my_data$gene_count)my_data$gene_count/sum(my_data$gene_count)
  • 感谢您的反馈。我有这个想法,但我想学习使用函数找到特定基因。
  • 欢迎来到 StackOverflow!如果您还没有这样做,请花一些时间查看要做什么when someone answers your question。访问 help center 可以找到有关 StackOverflow 新用户的更多信息。

标签: r function dataframe percentage


【解决方案1】:

这可能有用。

percent_in_total

percent_in_total = function(data, gene_in, cluster_in){
  data %>% 
  filter(gene == gene_in & cluster == cluster_in) %>% 
  .[["gene_count"]]/sum(gene_count)
}
percent_in_total(my_data,"PTN",2)
[1] 0.15

# data.table version
library(data.table)
percent_in_total = function(data, gene_in, cluster_in){
  setDT(data)[,
              .SD[gene == gene_in & cluster == cluster_in, gene_count]] / sum(gene_count)
}
percent_in_total(my_data,"PTN",2)
[1] 0.15

percent_in_cluster

我更喜欢使用data.table 的语法。解释这个过程,对于基因MT2A.SD[gene == gene_in & cluster == cluster_in, gene_count]gene_count = 5的编号,sum(.SD[cluster==cluster_in,gene_count])]cluster = 3的总基因编号,即5+5

library(data.table)
percent_in_cluster = function(data, gene_in, cluster_in){
  setDT(data)[,
              .SD[gene==gene_in & cluster==cluster_in, gene_count] / sum(.SD[cluster==cluster_in,gene_count])]
}
percent_in_cluster(my_data,"MT2A",3)
[1] 0.5

【讨论】:

  • 非常感谢。这真的很有帮助。我仍然对这个操作感到困惑。[[]],你能解释一下吗?非常感谢。
  • 嗨,在.[[]] 中,点表示上一个输入数据帧。 [["gene_count"]] 提取列。所有这些都像dt[["gene_count"]]。如果 thsi 有用,你可以接受这个分析器,谢谢。
  • 非常感谢。但实际上有一个问题。有没有办法知道基因在其簇中的百分比?我正在寻找每个基因相对于所有簇中的总基因计数和相对于每个簇的总基因计数的两个百分比。例如在簇 3 中表达的基因“MT2A”,要知道它在簇 3 中的百分比吗?结果应该是(5/(5+5)=0.5,簇3中只有两个基因:MT2A和COX6C)
  • @MK Huda 我给出的函数是计算总基因计数的百分比。您还想计算其集群中的百分比。好的我明白了。我会在我的回答中更新它。
  • 我已经更新了函数percent_in_cluster,现在应该没问题了。编辑部分为.SD[gene==gene_in & cluster==cluster_in, gene_count]
【解决方案2】:

你可以这样写函数:

percent <- function(data, my_gene, my_cluster) {
  sub_data <- subset(data, gene == my_gene & cluster == my_cluster)
  if(nrow(sub_data)) sum(sub_data$gene_count)/sum(data$gene_count)
  else cat("Gene is not expressed in this cluster")
}

percent(my_data, 'PTN', 2)
#[1] 0.15

percent(my_data, 'ABC', 2)
#Gene is not expressed in this cluster

【讨论】:

  • 非常感谢。它运作良好。我仍然不明白“if(nrow(sub_data)) sum(sub_data$gene_count)/sum(data$gene_count)”的含义。我理解 if 语句,如果条件“nrow(sub_data)”为真,那么它将运行命令“sum(sub_data$gene_count)/sum(data$gene_count)”。但是返回数字(对吗?)的 nrow(sub_data) 是如何实现的并使以下命令起作用?
  • 在 R 中,0 被视为FALSE,任何其他数字都被视为TRUE,所以我们在这里使用这个事实。如果有帮助,这与执行 if(nrow(sub_data) &gt; 0) 相同。
猜你喜欢
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多