[英]For loop over a List of Data frames
我在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循環,但是我無法使其工作。 也許對此問題有更好的解決方案。
您不需要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
在預先拆分的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
如果使用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。 在匯總各個觀察值(例如最小值)時,請記住要小心。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.