使用带有两个分组变量的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 回答
您可以使用
aggregate
功能,但仍然可以保留您的分组 .