【问题标题】:Subsetting in R using a list使用列表在 R 中设置子集
【发布时间】:2015-10-27 20:29:40
【问题描述】:

我有大量数据,我想根据其中一列(在本例中为潜水站点)中的值对其进行子集化。数据如下所示:

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

谢谢

【问题讨论】:

    标签: r subset


    【解决方案1】:

    这将创建一个列表,其中包含单独列表元素中的子集数据框。

    splitdat <- split(reefdata, reefdata$site)
    

    如果你想访问“alice”数据,你可以像这样引用它

    splitdat[["alice"]]
    

    【讨论】:

    【解决方案2】:

    我会使用 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
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-14
        • 2011-09-10
        • 2015-11-10
        • 2022-01-13
        • 2019-12-16
        • 2016-01-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多