使用列表在R中进行子集

时间:2015-10-27 20:29:41

标签: r subset

我有大量数据,我希望根据其中一列(本例中为潜水点)中的值进行分组。数据如下所示:

 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的知识,它正在增长,但仍然处于起步阶段)的子集,是否还有另一个命令,我应该正在调查?

谢谢

3 个答案:

答案 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 ]
}