【问题标题】:Subset data by randomly selecting rows based on two columns通过基于两列随机选择行来子集数据
【发布时间】:2016-02-20 17:04:19
【问题描述】:

我有一个很大的 data.frame,我想创建一个新的 data.frame,其中包含基于两列随机选择的行。

每个 FixDate 有 90 个唯一的 elkID,大约 48 行。我想创建一个新的 data.frame,其中包含 90 个唯一的 elkID,每个 FixDate 有 4 个随机选择的行。

数据如下所示:

> head(df)
elkID        X       Y       Fix.Date.Time    FixDate
1   245 550345.1 4826676 2010-02-24 10:00:58 2010-02-24
2   245 550217.9 4826519 2010-02-24 10:30:47 2010-02-24
3   245 550066.3 4826478 2010-02-24 11:00:41 2010-02-24
4   245 549912.6 4826419 2010-02-24 11:30:48 2010-02-24
5   245 549977.3 4826438 2010-02-24 12:00:55 2010-02-24
6   245 549795.1 4826294 2010-02-24 12:30:29 2010-02-24

我希望它看起来像这样(每个唯一 elkID 的每个 FixDate 4 行):

> df2
elkID        X       Y       Fix.Date.Time    FixDate
1   245 550345.1 4826676 2010-02-24 10:00:58 2010-02-24
2   245 550217.9 4826519 2010-02-24 10:30:47 2010-02-24
3   245 550066.3 4826478 2010-02-24 11:00:41 2010-02-24
4   245 549912.6 4826419 2010-02-24 11:30:48 2010-02-24
5   245 549977.3 4826438 2010-02-24 12:00:55 2010-02-25
6   245 549795.1 4826294 2010-02-24 12:30:29 2010-02-25

使用 RStudio V0.99.467 和 R3.2.1

【问题讨论】:

  • 我曾经有过类似的需求。我写了一个小函数来执行这种基于列和值的分层。也许它可以帮助你,请参阅 SciencesPo 包中的 stratified

标签: r loops random unique subset


【解决方案1】:

如果您想遍历它们,可以尝试以下操作:

# initialize a new dataframe to store new data
newdf = NULL    

# extract unique elk IDs
IDs = unique(df$elkID)

# create a loop to subset each ID first (i loop) and secondly
# loop through the unique dates (j loop)
for(i in 1:length(IDs)){
  data1 = df[df$elkID == IDs[i],]
  dates = unique(data1$FixDate)
  for(j in 1:length(dates)){
    data2 = data1[data1$FixDate == dates[j],]
    # this should select 4 rows at random for each particular ID and date
    data2 = data2[sample(1:nrow(data2),4),]
    newdf = rbind(newdf,data2)
  }
}

head(newdf)
tail(newdf)

这是否符合您的要求?

【讨论】:

  • 那一行代码太诱人了,我就直接上那行了。不过感谢您的帮助!稍后我会尝试这个,因为我真的在为编写循环而苦苦挣扎,而这个是为我的数据编写的!
【解决方案2】:

对于大型数据框,我推荐使用 data.table 包:

library(data.table)
setDT(df)
df[, .SD[sample(.N, 4)] , by=.(elkID, FixDate)] #or
df[, .SD[sample(.N, 4)] , keyby=.(elkID, FixDate)]

【讨论】:

    猜你喜欢
    • 2016-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 2016-07-02
    • 1970-01-01
    相关资源
    最近更新 更多