首页 文章

应用rowMeans()时保持split()中使用的因子分组变量

提问于
浏览
0

使用带有两个分组变量的split()会给我一个列表,其中包含我的所有变量,包括我以前用来组合的变量 .

> s <- split (iris, list(iris$Sepal.Length,iris$Species), drop = T)

$`4.3.setosa`
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
14          4.3           3          1.1         0.1  setosa

$`4.4.setosa`
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
9           4.4         2.9          1.4         0.2  setosa
39          4.4         3.0          1.3         0.2  setosa
43          4.4         3.2          1.3         0.2  setosa
...

现在我要计算iris $ Sepal.Width和iris $ Petal.Width的rowMeans() . 由于虹膜$ Species是一个因素,我不能简单

> sapply(s, drop = T), rowMeans())

Error in FUN(X[[i]], ...) : 'x' must be numeric

我可以对我感兴趣的变量进行子集和计算,但是后来我丢失了我的分组变量(它们仍然在结果行名称中,但不是直接使用的格式:“4.3.setosa”等)

> s <- lapply(s, subset, select = c("Sepal.Width", "Petal.Width"))
> t(sapply(s, colMeans))
               Sepal.Width Petal.Width
4.3.setosa        3.000000   0.1000000
4.4.setosa        3.033333   0.2000000
...

我想到任何优雅的解决方案 . 我知道我之后可以将它们分开(https://stackoverflow.com/a/43431847/9015909),但如果出现任何变量并且名字中有一个点,那就太糟糕了 . 我想写一个for循环,c()用s [[i]] [1,c("Sepal.Length","Species")绑定每个colMeans()结果,然后将它们组合在一个数据框中可以工作,但我觉得有一个更优雅的解决方案,我只是没有看到 . 提前感谢任何建议 .

1 回答

  • 0

    您可以使用 aggregate 功能,但仍然可以保留您的分组 .

    aggregate(.~Species,iris,mean)
          Species Sepal.Length Sepal.Width Petal.Length Petal.Width
     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
    

相关问题