我可以创建一个函数来使用循环制作这样的数据框吗? (跟进问题)
Can I make a function that makes a dataframe like this using loops? (follow up question)
感谢您对此问题的关注。
我有如下数据。
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]))
基于下面的代码,我想制作一个函数,可以根据概率概率 (replace=TRUE) 和四个具有相同概率的随机字母 (replace=FALSE) 循环 4 个等级数字。例如,此循环可能如下所示:
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))
感谢您阅读这个问题。
这是我认为您所追求的解决方案。我在抽样时没有指定概率向量 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>
感谢您对此问题的关注。
我有如下数据。
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]))
基于下面的代码,我想制作一个函数,可以根据概率概率 (replace=TRUE) 和四个具有相同概率的随机字母 (replace=FALSE) 循环 4 个等级数字。例如,此循环可能如下所示:
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))
感谢您阅读这个问题。
这是我认为您所追求的解决方案。我在抽样时没有指定概率向量 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>