我在R中使用mtcars数据集。我有一个数据框列表(mtcars数据集分为多个柱面)。我需要:
到目前为止我执行的步骤如下:
# load the data
data(mtcars)
# split cars data.frame into a list of data frames by cylinder
cars <- split(mtcars, mtcars$cyl)
# find the position within each data frame for the min values of mpg (i.e. first
# column)
positions <- sapply(cars,function(x) which.min(x[,1]))
在我看来,下一步是在每个数据帧上循环以找到每个位置的马力值。我试图为此制作一个For循环,但我还没有能够使它工作。也许有更好的解决方案解决这个问题。
答案 0 :(得分:4)
您无需split
数据,然后使用sapply
。有许多方法可以使用更有效的方法来达到输出。这可能是data.table
解决方案
mtcars$Cars <- rownames(mtcars)
library(data.table)
data.table(mtcars)[, list(Car = Cars[which.min(mpg)],
HP = hp[which.min(mpg)]),
by = cyl]
# cyl Car HP
# 1: 6 Merc 280C 123
# 2: 4 Volvo 142E 109
# 3: 8 Cadillac Fleetwood 205
或者可能使用dplyr
library(dplyr)
mtcars %>%
mutate(Cars = rownames(mtcars)) %>%
group_by(cyl) %>%
summarize(Car = Cars[which.min(mpg)], HP = hp[which.min(mpg)])
# Source: local data frame [3 x 3]
#
# cyl Car HP
# 1 4 Volvo 142E 109
# 2 6 Merc 280C 123
# 3 8 Cadillac Fleetwood 205
答案 1 :(得分:1)
从预分割cars
集中,您可以通过Map
和Reduce
这样做。
> Reduce(rbind,
Map(function(x) x[which.min(x$mpg), "hp", drop = FALSE],
cars, USE.NAMES = FALSE)
)
hp
# Volvo 142E 109
# Merc 280C 123
# Cadillac Fleetwood 205
如果你想要一个矢量,你可以将上面的代码分配给一个变量,比如说rr
,然后做
> setNames(rr[,1], rownames(rr))
# Volvo 142E Merc 280C Cadillac Fleetwood
# 109 123 205
答案 2 :(得分:1)
如果您使用plyr库,这非常简单。你走了:
library(plyr)
data(mtcars)
mpMins <- ddply(mtcars, .(cyl),summarize, min = min(mpg), .drop = FALSE)
mpMins
cyl min
1 4 21.4
2 6 17.8
3 8 10.4
这只会给你mpg的最小值,你也想要马力
hpMins <- (merge(mpMins, mtcars, by.x = c("min","cyl"), by.y = c("mpg","cyl" )))$hp
hpMins
[1] 205 215 123 109
奇怪,有四个值。你说你想要三个。如果您返回并检查数据,则8缸类别有两个最小值10.4。记住在个人观察中使用汇总值(如最小值)时要小心。