[英]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.