簡體   English   中英

用於循環訪問數據幀列表

[英]For loop over a List of Data frames

我在R中使用mtcars數據集。我有一個數據幀列表(mtcars數據集分為圓柱數)。 我需要:

  1. 用每種氣缸類型(即4,6,8)內每加侖的英里數(mpg)的最小值來標識汽車。
  2. 創建一個向量,該向量存儲在步驟1中找到的每輛汽車的馬力(hp)值(向量的長度為3)。

到目前為止,我已執行的步驟如下:

# 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組中,您可以使用MapReduce

> 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM