【问题标题】:Randomly return a row number for a subset in the data frame随机返回数据框中子集的行号
【发布时间】:2016-10-18 13:11:08
【问题描述】:

我希望能够从数据集中随机返回一个行号,其中行是数据的子集。以数据框为例

x.f<-data.frame(
     G = c("M","M","M","M","M","M","F","F","F","F","F","F"),
     A = c("1","2","3","1","2","3","1","2","3","1","2","3"),
     E = c("W","W","W","B","B","B","W","W","W","B","B","B"))

比如说,我想随机给我一个行号,其中 G=="M" 和 A=="3",所以答案将是第 3 行或第 6 行。返回的数字必须是位置在原始数据框中。虽然这个例子的结构很好(每个可能的组合只出现一次),但实际上不会有这样的结构,例如组合 (M,2,W) 将随机分布在整个数据帧中,并且可能出现更多或更少的次数比其他组合。

【问题讨论】:

  • 您想获取所有行或仅随机选择的行,例如偶然?
  • 请仅一行,即在本例中为 3 或 6,概率相等。

标签: r random


【解决方案1】:

使用Sourabh 和sample 的答案你可以试试:

# create a function using the sample function, which selects one value by chance
foo <- function(G, A, data){
  sample(which(data$G == G & data$A == A), 1)
}

foo("M", 3, x.f)
3

要测试相等性,例如使用循环运行函数 1000 次:

res <- NULL
for(i in 1:1000){
  res[i] <- foo("M", 3, x.f)
}
hist(res)

似乎是平均分配。

【讨论】:

  • 看起来不错,并且清楚地解释了如何完成任务。感谢 Souabh 和 Jimbou。
【解决方案2】:

请试一试:which(((x.f$G == "M") &amp; (x.f$A == 3)))

【讨论】:

    【解决方案3】:

    或者这个:

    row.names(subset(x.f, x.f$G == "M" & x.f$A == 3))
    [1] "3" "6"
    

    【讨论】:

    • 好的开始,谢谢。然后我可以随机抽取一个值,以相同的概率选择 3 或 6?
    【解决方案4】:

    其他任何一个答案都会为您提供满足您条件的行列表,但不会随机选择一行。完整答案:

    sample(which(x.f$G == "M" & x.f$A == 3),1)
    

    sample(row.names(subset(x.f, x.f$G == "M" & x.f$A == 3)),1)
    

    sample(row.names(x.f[x.f$G=="M" & x.f$A==3,]),1)
    

    一切正常。可能有两种或三种其他方法可以生成与一组条件匹配的行索引或名称列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-04
      • 1970-01-01
      • 2017-09-21
      • 2012-03-26
      • 2017-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多