【问题标题】:Can I make a function that makes a dataframe like this using loops? (follow up question)我可以制作一个使用循环制作像这样的数据框的函数吗? (后续问题)
【发布时间】:2021-07-05 16:03:55
【问题描述】:

感谢您对此问题的关注。

我有如下数据。

a<- data.frame("Grade"=c(1, 2, 3, 4), "Prob"=c(0.01, 0.25, 0.45, 0.29))
b<- data.frame("Pot"= c(letters[1:18]))

基于下面的代码,我想制作一个函数,它可以根据 Prob 概率 (replace=TRUE) 循环 4 个等级数字和具有相同概率 (replace=FALSE) 的四个随机字母。例如,这个循环可能如下所示:

3 2 3 2 d f k g
1 3 4 2 a k r b 

我想做一个函数,它不仅可以计算成绩结果仅低于 3 的结果,而且我选择的四个字母出现,而且可以计算得到这个结果的试验次数。因此,如果我希望 Pot 具有“a”、“b”、“c”和“d”,结果将如下所示:

 Trial Grade   Pot
15    3 2 1 3  a b c d
39    2 1 2 2  d b a c
2     3 3 3 3  d a b d
77    3 2 3 3  c d b a

感谢一位非常友善的人,我可以学习以下代码,但我无法对其进行编辑以获得我希望看到的结果。你能帮帮我吗?

     samplefun <- function(a) {
      c <- sample(a$Grade, size=4, prob=a$Prob, replace=TRUE)
      
      res <- tibble(
        Trial = which(c < 3)[1],
        Result = c[which(c < 3)[1]]
      )
nsamples <- 1000
x<-map_dfr(1:nsamples, ~ samplefun(a))

感谢您阅读此问题。

【问题讨论】:

  • 如果您尝试使用a$Prob 中的概率对b$Pot 进行采样,则会出现错误,因为a$Prob 的长度与b$Pot 不匹配。您能否在数据框b 中提供另一列概率,或者修改您的问题以避免此问题?

标签: dataframe function loops sample


【解决方案1】:

这是我认为您所追求的解决方案。我在采样b$Pot 时没有指定概率向量,因为您在问题中没有给出一个长度为 18 个元素的概率向量(请参阅我的评论)。

library(tidyverse)

a<- data.frame(Grade =c(1, 2, 3, 4), Prob = c(0.01, 0.25, 0.45, 0.29))
b<- data.frame(Pot = letters[1:18])

chosenletters <- c("a", "b", "c", "d")

samplefun <- function(a, b, chosenletters) {
  ntrials <- 0
  
  repeat {
    grades <- sample(a$Grade, size = 4, prob = a$Prob, replace = T)
    chars <- sample(b$Pot, size = 4, replace = F)
    ntrials <- ntrials + 1
    
    if (all(grades < 4) & all(chars %in% chosenletters)) {break}
  }
  
  return( tibble(Trial = ntrials, Grade = list(grades), Letters = list(chars)) )
}

nsamples <- 5
res <- map_dfr(1:nsamples, ~ samplefun(a, b, chosenletters))

此数据框res 提供嵌入在每个数据框单元格内列表中的正确等级和字母,以及生成结果的试验。

# A tibble: 5 x 3
  Trial Grade     Letters  
  <dbl> <list>    <list>   
1 20863 <dbl [4]> <fct [4]>
2  8755 <dbl [4]> <fct [4]>
3 15129 <dbl [4]> <fct [4]>
4  1033 <dbl [4]> <fct [4]>
5  5264 <dbl [4]> <fct [4]>

嵌套列表的更好视图:

> glimpse(res)
Rows: 5
Columns: 3
$ Trial   <dbl> 20863, 8755, 15129, 1033, 5264
$ Grade   <list> <3, 3, 3, 3>, <3, 2, 2, 2>, <3, 3, 2, 2>, <3, 3, 2, 3>, <3, 2, 3, 3>
$ Letters <list> <b, a, c, d>, <b, a, c, d>, <c, a, b, d>, <b, d, c, a>, <a, b, d, c>

【讨论】:

  • 感谢您提供解决方案。对于“b$pot”的概率是的,概率只是一个/字母的数量,所以你的方法是我正在寻找的正确方法。再次,非常感谢您回答另一个问题。我能问一下你在哪里学习或学习这些吗?我非常渴望更多地了解这一点。我还看到了您的个人资料,得知您是博士生。我也是博士生!祝你好运! (这些问题与我的任何学习或工作无关。它们只是我纯粹的好奇心......谢谢!)
  • 太好了,不用担心,很高兴它再次有用!我主要通过将 R 用作我的研究的一部分并在此过程中向主管/同行学习来实际学习 R,尽管我已经阅读过它并且在空闲时间也花了很多时间学习它。我建议阅读R for Data Science,做一些小项目,如果你想更深入地研究,再去Advanced R。谢谢,也祝你的博士学习好运!
  • 非常感谢罗伊!我将开始研究这个。祝您有美好的一天!
猜你喜欢
  • 2017-06-04
  • 1970-01-01
  • 1970-01-01
  • 2013-10-26
  • 1970-01-01
  • 2021-06-04
  • 1970-01-01
  • 1970-01-01
  • 2017-01-02
相关资源
最近更新 更多