我从R中的数据帧列表中提取特定行,并希望将这些行组合成新的数据帧。例如,我将使用虹膜数据:
data(iris)
a.iris <- split(iris, iris$Species)
b.iris <- lapply(a.iris, function(x) with(x, x[3,]))
我希望将lapply()
的返回值排列成与原始数据帧结构相同的单个数据帧(例如names(iris)
)。我一直在寻找plyr包,但找不到合适的代码来完成这项工作。非常感谢任何帮助!
布赖恩
答案 0 :(得分:4)
您可以do.call()
使用rbind()
并简化lapply()
来电。
a.iris <- split(iris, iris$Species)
b.iris <- do.call(rbind, lapply(a.iris, `[`, 3, ))
b.iris
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## setosa 4.7 3.2 1.3 0.2 setosa
## versicolor 6.9 3.1 4.9 1.5 versicolor
## virginica 7.1 3.0 5.9 2.1 virginica
> all.equal(names(iris), names(b.iris))
## [1] TRUE
当然,您也可以使用tapply()
查找每个组的第三行。
iris[tapply(seq_len(nrow(iris)), iris$Species, `[`, 3), ]
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 3 4.7 3.2 1.3 0.2 setosa
# 53 6.9 3.1 4.9 1.5 versicolor
# 103 7.1 3.0 5.9 2.1 virginica