根据回复进行了更新。添加了可重复的数据。不幸的是,我必须在For循环中进行For循环。
我需要在for循环中执行for循环以确定列的意思。外部for循环用于确定哪些列是数字。内部for循环计算每列的均值(同时排除NA)。我想我有外环了。我似乎无法弄清楚如何用我正在采取的方法进行内循环。非常感谢任何帮助。
a <- c('Ned', 'Rod', 'Todd')
b <- c(60, 10, 8)
c <- c(190, 80, 60)
Flanders <- data.frame(Name=a, Age=b, Weight=c)
numericvars <- NULL
for (m in names(Flanders)){
if(class(Flanders[,m]) == 'integer' | class(Flanders[,m]) == 'numeric'){
numericvars[m] <- mean(Flanders[,m],na.rm = TRUE)
}
}
答案 0 :(得分:2)
如果您愿意采用不同的路线,还有其他工具可供选择。特别是,来自summarise_if
的{{1}}可能对您有用(使用内置dplyr
数据,因为不包含可重现的数据:
iris
返回
summarise_if(iris, is.numeric, mean)
它具有与 Sepal.Length Sepal.Width Petal.Length Petal.Width
1 5.843333 3.057333 3.758 1.199333
很好地协作的附加版本,使其可以灵活地满足其他需求。例如:
group_by
返回
iris %>%
group_by(Species) %>%
summarise_if(is.numeric, mean)
如果你真的必须使用 Species Sepal.Length Sepal.Width Petal.Length Petal.Width
<fctr> <dbl> <dbl> <dbl> <dbl>
1 setosa 5.006 3.428 1.462 0.246
2 versicolor 5.936 2.770 4.260 1.326
3 virginica 6.588 2.974 5.552 2.026
循环,那么应该这样做:
for
生成包含以下内容的矢量numericvars <- NULL
for (m in names(iris)){
if(class(iris[,m]) == 'integer' | class(iris[,m]) == 'numeric'){
numericvars[m] <- mean(iris[,m], na.rm = TRUE)
}
}
numericvars
或者,您可以使用其中一个Sepal.Length Sepal.Width Petal.Length Petal.Width
5.843333 3.057333 3.758000 1.199333
并简化您的代码。在这里,它循环遍历每一列,检查它是否为数字(我相信它对整数也显示为TRUE),如果是,则返回均值,如果不是则返回NA。如果你真的不希望它们出现在结果中,你可以删除NA:
apply
返回
sapply(iris, function(x){
if(is.numeric(x)){
mean(x, na.rm = TRUE)
} else{
NA
}
})
答案 1 :(得分:0)
我喜欢Mark的dplyr
解决方案,但如果你想要一个Base R解决方案,我想我会提供一个。
您可以使用colMeans
和sapply
通过滥用数据框是向量列表的事实来执行此操作。
colMeans(mydata[sapply(mydata,function(x) inherits(x,"numeric") |
inherits(x,"integer"))])
在
sapply(mydata,function(x) inherits(x,"numeric") |
inherits(x,"integer"))
根据列inherits
列numeric
或integer
返回逻辑向量。我建议inherits
在处理数据框中具有多个类属性的变量时优于==
。
然后我使用逻辑的结果向量来保留mydata
的相关子集,并使用colMeans
来快速计算每列的含义。
使用diamonds
ggplot2
的示例
data(diamonds,package = "ggplot2")
mydata = diamonds
colMeans(mydata[sapply(mydata,function(x) inherits(x,"numeric") |
inherits(x,"integer"))])
## carat depth table price x
## 0.7979397 61.7494049 57.4571839 3932.7997219 5.7311572
## y z
## 5.7345260 3.5387338
编辑:
似乎is.numeric
是一种更好的方法来检查哪个确实返回TRUE
整数,正如另一个答案所示,所以
colMeans(mydata[sapply(mydata,is.numeric)])
与上述相同。此外,colMeans
也有na.rm
参数。
进一步编辑:
刚刚看过@ RichScriven的评论,这些评论必定在我打字的时候才会出现,所以也是因为那里的信用。
答案 2 :(得分:0)
这是一个非常奇怪但工作(并且工作)函数在循环中使用循环。希望它可以提供一些帮助。请注意,整数类似于数字的子类。
numericvars <- NULL
flanders.mean <- NULL
for (m in names(Flanders)){
if(is.numeric(Flanders[, m])){
numericvars <- c(numericvars, m)
}
for (k in numericvars) {
flanders.mean[m] <- sum(Flanders[, m])/nrow(Flanders)
}
}
flanders.mean
Age Weight
26 110