我有大量数据,我希望根据其中一列(本例中为潜水点)中的值进行分组。数据如下所示:
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
我想创建一个数据的子集,其中一次只包含一个潜点的数据(例如,一个用于alice,一个用于步骤,一个用于andrea1等...)。
我知道我可以使用
单独分配每个alice <- subset(reefdata, site=="alice")
但是因为我有超过100个不同的网站,所以希望避免必须单独指定每个子集。我认为这个子集可能不够灵活,我不能通过一个名单列表(或者至少不是我目前对R的知识,它正在增长,但仍然处于起步阶段)的子集,是否还有另一个命令,我应该正在调查?
谢谢
答案 0 :(得分:4)
这将创建一个列表,其中包含单独列表元素中的子集数据框。
splitdat <- split(reefdata, reefdata$site)
然后,如果你想访问&#34; alice&#34;您可以像
那样引用它的数据splitdat[["alice"]]
答案 1 :(得分:1)
我会使用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
答案 2 :(得分:0)
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 ]
}