R For循环列意味着

时间:2016-11-14 20:06:15

标签: r

根据回复进行了更新。添加了可重复的数据。不幸的是,我必须在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)
  }
}

3 个答案:

答案 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解决方案,我想我会提供一个。

您可以使用colMeanssapply通过滥用数据框是向量列表的事实来执行此操作。

colMeans(mydata[sapply(mydata,function(x) inherits(x,"numeric") | 
         inherits(x,"integer"))])

sapply(mydata,function(x) inherits(x,"numeric") | 
         inherits(x,"integer"))

根据列inheritsnumericinteger返回逻辑向量。我建议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