簡體   English   中英

使用列表在R中進行子設置

[英]Subsetting in R using a list

我有大量的數據,我想根據其中一列(在這種情況下為潛水站點)中的值進行子集化。 數據如下所示:

 site   weather depth_ft depth_m vis_ft vis_m coral_safety coral_deep rate
alice      rain       95      NA     50    NA            2          4    9
alice      over       NA      25     NA    25            2          4    9
steps     clear       NA      27     NA    25            2          4    9
steps                 NA      30     NA    20            1          4    9
andrea1   clear       60      NA     60    NA            2          4    5

我想創建一個數據子集,一次僅包含一個潛水點的數據(例如,一個愛麗絲的子集,一個用於步驟的子集,一個用於andrea1的子集等)。

我知道我可以使用

alice <- subset(reefdata, site=="alice")

但是由於我有100多個不同的站點作為子集,因此希望避免必須單獨指定每個子集。 我認為該子集可能不夠靈活,無法讓我通過一個名稱列表來對它進行子集化(或者至少不了解我目前對R的了解,R正在增長,但仍處於起步階段),還有另一條命令我應該正在調查?

謝謝

這將創建一個列表,該列表在單獨的列表元素中包含子數據幀。

splitdat <- split(reefdata, reefdata$site)

然后,如果您要訪問“ alice”數據,則可以像這樣引用它

splitdat[["alice"]]

我會用plyr包。

library(plyr)
ll <- dlply(df,.variables = c("site"))

結果:

>ll
$alice
   site weather depth_ft depth_m vis_ft vis_m coral_safety coral_deep rate
1 alice    rain       95      NA     50    NA            2          4    9
2 alice    over       NA      25     NA    25            2          4    9

$andrea1
 site weather depth_ft depth_m vis_ft vis_m coral_safety coral_deep rate
1 andrea1   clear       60      NA     60    NA            2          4    5

$steps
   site weather depth_ft depth_m vis_ft vis_m coral_safety coral_deep rate
1 steps   clear       NA      27     NA    25            2          4    9
2 steps    <NA>       30      NA     20     1            4          9   NA

split()dlply()是完美的一槍解決方案。

如果您想要一個帶有循環的“逐步”過程(許多R用戶對此很不滿意,但是我發現它對理解正在發生的事情很有幫助),請嘗試以下操作:

# create vector with site names, assuming reefdata$site is a factor
sites <- as.character( unique( reefdata$site ) )

# create empty list to take dive data per site
dives <- list( NULL ) 

# collect data per site into the list
for( i in 1:length( sites ) )
{
 # subset
    dive <- reefdata[ reefdata$site == sites[ i ] , ]
 # add resulting data.frame to the list
    dives[[ i ]] <- dive
 # name the list element
    names( dives )[ i ] <- sites[ i ]
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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