# 读取 Excel 文件,行为样本,列为真菌、细菌、OTU df <- read.xlsx("C:/Users/63035/Desktop/土壤微生物整理 - 副本/计算相对丰度/细菌原始数值1.xlsx", sheet = 1) df <- df[,3:74] # 将每个值除以对应列的第73行数值 # apply,lapply,sapply df1 <- sapply(1:nrow(df),FUN = function(x){as.numeric(df[x,])/as.numeric(df[73, ])}) 修改R语言脚本,计算每列的和,用每个值除以对应列的和
时间: 2024-02-20 12:01:40 浏览: 177
可以使用`apply`函数计算每列的和,然后再用每个值除以对应列的和。修改后的代码如下:
```
# 读取 Excel 文件,行为样本,列为真菌、细菌、OTU
df <- read.xlsx("C:/Users/63035/Desktop/土壤微生物整理 - 副本/计算相对丰度/细菌原始数值1.xlsx", sheet = 1)
df <- df[,3:74]
# 计算每列的和
col_sum <- apply(df, 2, sum)
# 将每个值除以对应列的和
df1 <- apply(df, 2, function(x){as.numeric(x)/col_sum})
```
其中`apply(df, 2, sum)`计算了每列的和,`apply(df, 2, function(x){as.numeric(x)/col_sum})`将每个值除以对应列的和。
相关问题
library(tidyverse) library(vegan) library(ggpubr) #设置新罗马字体 windowsFonts(A=windowsFont("Times New Roman"), B=windowsFont("Arial")) #读取数据 setwd("D:/R") df <- read.csv("NMDS.csv",header = T) #nmds分析 nmds <- metaMDS(select(df, starts_with("OTU"))) str(nmds) scores(nmds)$sites %>% cbind(df) %>% ggplot(aes(x = NMDS1, y = NMDS2)) + geom_point(aes(size = 0.5, color = Group)) + stat_chull(geom = "polygon", aes(group = Group, color = Group, fill = Group), alpha = 0.1) + annotate("text", x = -0.15, y = 0.1, label = paste0("stress: ", format(nmds$stress, digits = 4)), hjust = 0) + theme_bw(base_size = 18)+ theme(text=element_text(family="A",size=20))
这段代码是一段NMDS分析的代码,如果你想修改这段代码,可以根据你的具体需求进行修改,以下是一些可能的修改建议:
1. 修改文件路径:根据你的数据存储位置,修改以下代码中的路径:
```
setwd("D:/R")
df <- read.csv("NMDS.csv",header = T)
```
2. 修改绘图参数:根据你的绘图需求,修改以下代码中的绘图参数,如颜色、点的大小、字体等等:
```
geom_point(aes(size = 0.5, color = Group)) + # 修改点的大小和颜色
annotate("text", x = -0.15, y = 0.1, label = paste0("stress: ", format(nmds$stress, digits = 4)), hjust = 0) + # 修改注释的位置和字体
theme_bw(base_size = 18)+ # 修改字体大小
theme(text=element_text(family="A",size=20)) # 修改字体类型和大小
```
3. 修改分析方法:根据你的分析需求,修改以下代码中的分析方法和参数:
```
nmds <- metaMDS(select(df, starts_with("OTU")))
```
这里使用了vegan包中的metaMDS函数进行NMDS分析,你可以根据需要选择其他方法或改变参数。
希望这些修改建议对你有所帮助。
from scipy.stats import ttest_ind for i in range(0,len(otu_map_match.index)): if i+1>len(otu_map_match.index): break pvalue = pd.DataFrame() tvalue = pd.DataFrame() tmp1 = otu_map_match.filter(like=otu_map_match.index[i],axis=0).drop(['#SampleID','Group'],axis=1) tmp2 = otu_map_match.filter(like=otu_map_match.index[i+1],axis=0).drop(['#SampleID','Group'],axis=1) for j in range(0,len(otu_map_match.columns)): pvalue.loc[tmp1.index[i],tmp2.index[i]] = ttest_ind(tmp1.iloc[:,j],tmp2.iloc[:,j])[1] tvalue.loc[tmp1.index[i],tmp2.index[i]] = ttest_ind(tmp1.iloc[:,j],tmp2.iloc[:,j])[0]
这段代码没有明显的语法错误,但是其中有一些潜在的逻辑问题:
1. 在判断i+1是否大于len(otu_map_match.index)时,应该使用小于号而不是大于号,否则会跳过最后一个样本;
2. 在for循环中,pvalue和tvalue的行索引和列索引都是用的i而不是j,这样会导致结果被覆盖,应该将i改为j;
3. 在使用ttest_ind函数时,需要确保样本之间的数据长度相等,否则会报错,这个问题需要根据具体数据进行处理。
下面是修改后的代码,您可以参考一下:
```python
from scipy.stats import ttest_ind
pvalue = pd.DataFrame()
tvalue = pd.DataFrame()
for i in range(len(otu_map_match.index) - 1):
tmp1 = otu_map_match.filter(like=otu_map_match.index[i], axis=0).drop(['#SampleID','Group'], axis=1)
tmp2 = otu_map_match.filter(like=otu_map_match.index[i+1], axis=0).drop(['#SampleID','Group'], axis=1)
for j in range(len(otu_map_match.columns)):
if len(tmp1.iloc[:,j]) != len(tmp2.iloc[:,j]):
continue
pvalue.loc[tmp1.columns[j], tmp2.columns[j]] = ttest_ind(tmp1.iloc[:,j], tmp2.iloc[:,j])[1]
tvalue.loc[tmp1.columns[j], tmp2.columns[j]] = ttest_ind(tmp1.iloc[:,j], tmp2.iloc[:,j])[0]
```
希望能对您有所帮助。
阅读全文