R函数不返回预期的向量
我试图根据两个分组(门和环境)计算平均值(以及其他计算),我想重定向到输出到一个文件。我知道下面的代码是有效的R函数不返回预期的向量,r,function,loops,R,Function,Loops,我试图根据两个分组(门和环境)计算平均值(以及其他计算),我想重定向到输出到一个文件。我知道下面的代码是有效的 new_df = myDF[(myDF$Environment=='Water_MarineTreated') & (myDF$Phylum=='Acidobacteria'),] print(mean(new_df$pH)) 然而,因为有如此多的环境和众多的门,我觉得一个包含循环的函数是最好的方法。我有一个函数,它取一个向量的名称和计算的名称(例如,mean、sd、var等
new_df = myDF[(myDF$Environment=='Water_MarineTreated') & (myDF$Phylum=='Acidobacteria'),]
print(mean(new_df$pH))
然而,因为有如此多的环境和众多的门,我觉得一个包含循环的函数是最好的方法。我有一个函数,它取一个向量的名称和计算的名称(例如,mean、sd、var等),循环遍历每个环境和每个门,计算每个排列的平均pH值,将其添加到向量,然后返回向量。不幸的是,返回值是“数值(0)”。虽然这是返回我告诉它,它不是我想要的
我认为规则是每篇文章有一个问题,所以如果有人能解释为什么有一个返回的空向量,而不是一个充满pH均值的向量,我将不胜感激。如果规则可以稍微弯曲一点,有人可以回答为什么“eName=numeric()”不起作用,我也会很感激。如果我在内部循环中放置一个伪print语句,当我使用eName=numeric()时,如果我初始化Water\u MarineTreated=numeric(),则不会打印任何内容,因为该伪语句在printed中
我的函数和函数调用可以在下面看到
fileName = 'mini.txt'
myDF = read.csv(fileName, header = TRUE, sep = ' ')
environment = unique(unlist(myDF$Environment, use.names = FALSE))
phyla = unique(unlist(myDF$Phylum, use.names = FALSE))
Statistics = function(eName, funName)
{
#eName = numeric() #This approach does not work?!!
for (i in environment)
{
for (j in phyla)
{
stats_df = myDF[(myDF$Environment==i) & (myDF$Phylum==j),]
if (i == deparse(substitute(eName)))
{
#Water_MarineTreated == c(Water_MarineTreated, funName(as.numeric(stats_df$pH)))
eName == c(eName, funName(as.numeric(stats_df$pH)))
print('dummy_statement')
}
}
}
return(eName)
}
Water_MarineTreated = numeric()
Water_MarineTreated = Statistics(Water_MarineTreated, mean)
print(Water_MarineTreated)
输入的示例如下所示:
Phylum pH Environment
Acidobacteria 5.4 Water_MarineTreated
Acidobacteria 6.1 Water_PondTreated
Acidobacteria 6.1 Water_MarineTreated
Acidobacteria 5.6 Water_MarineTreated
Acidobacteria 6.2 Water_MarineTreated
Deinococcus_Thermus 4.9 Water_MarineTreated
Firmicutes 5.1 Water_MarineTreated
Firmicutes 5.5 Water_MarineTreated
data.table
包提供了一种非常好的语法,可以按组快速计算函数。考虑下面的例子:
library(data.table)
# Convert sample data to a data.table:
dt <- as.data.table(mtcars)
# Calculate the mean and median mpg by cyl and gear, where carb < 8:
dt[carb<8, # The "where clause"
list(mpg.mean=mean(mpg), mpg.med=median(mpg)), # What you want to calculate
by=list(cyl,gear)] # The groups go here
# cyl gear mpg.mean mpg.med
#1: 6 4 19.750 20.10
#2: 4 4 26.925 25.85
#3: 6 3 19.750 19.75
#4: 8 3 15.050 15.20
#5: 4 3 21.500 21.50
#6: 4 5 28.200 28.20
#7: 8 5 15.800 15.80
#8: 6 5 19.700 19.70
库(data.table)
#将示例数据转换为data.table:
dt您的解决方案可以使用plyr
软件包获得:
library(plyr)
ddply(mtcars,.(mpg,cyl),colwise(mean))
对于您的数据,如果您试图查找除Environment和Phylum之外的所有列的平均值(并假设这些是数字)
注:如果你想要SD,用SD替换平均值。 你在循环的中线:
eName == c(eName, funName(as.numeric(stats_df$pH)))
双等号==
表示比较并返回TRUE
或FALSE
,它不执行任何赋值。因此,eName
开始时是一个空向量,从来没有分配过任何内容。这只是我喜欢的原因之一,我完全看到了错误(=!=)。我更改了它,它将返回一个结果。您关于覆盖的评论也是正确的。我将修改我的代码或使用其他建议。谢谢。我对R很陌生,我不熟悉那个软件包。我已经安装了它,它完全符合我的要求,只需要很少的编码。非常感谢。
eName == c(eName, funName(as.numeric(stats_df$pH)))
eName[i] <- ...
eName[i,] <- ...