R:从相邻行中的条目创建随机样本
R: Creating Random Samples From Entries in Neighboring Row
我正在使用 R 编程语言。
我有以下数据集:
my_data = data.frame(id = c(1,2,3,4,5), n = c(15,3,51,8,75))
我想创建一个新变量,它根据“n”的对应值为每一行生成一个随机整数。我尝试使用以下代码执行此操作:
my_data$rand = sample.int(my_data$n,1)
但这不起作用(相同的随机数重复 5 次)。
我也试过为此定义一个函数:
my_function <- function(x){sample.int(x,1)}
transform(my_data, new_column= my_function(my_data$n) )
但这也不起作用(相同的随机数再次重复 5 次)..
最后,我正在努力实现这样的目标:
my_data$rand = c(sample.int(15,1), sample.int(3,1), sample.int(51,1), sample.int(8,1), sample.int(75,1))
有人可以告诉我如何对更大的数据集执行此操作而不必手动指定每个“sample.int”命令吗?
谢谢!
我们可以使用 sapply
遍历 my_data
中的所有行,并在每次迭代中生成一个 sample.int
。
my_data$rand <- sapply(1:nrow(my_data), function(x) sample.int(my_data[x, 2], 1))
id n rand
1 1 15 7
2 2 3 2
3 3 51 28
4 4 8 6
5 5 75 9
当您说“基于 n
的值”时,您到底是什么意思?基于n
如何?
猜测#1:在每一行,你想抽取一个随机数,可能的值是 1 到 n
。
猜测#2:在每一行,你想为 0 到 1 之间的可能值绘制 n
个随机数。
第二个选项更难,但选项 #1 可以通过循环完成:
my_data = data.frame(id = c(1,2,3,4,5), n = c(15,3,51,8,75))
my_data$rand = NA
set.seed(123)
for(i in 1:nrow(my_data)){
my_data$rand[i] = sample(1:(my_data$n[i]), size = 1)
}
my_data
id n rand
1 1 15 15
2 2 3 3
3 3 51 51
4 4 8 6
5 5 75 67
您可以通过一次调用 runif()
、乘以 n
并向上舍入来高效地完成此操作:
transform(my_data, rand = ceiling(runif(n) * n))
id n rand
1 1 15 13
2 2 3 1
3 3 51 41
4 4 8 1
5 5 75 9
我正在使用 R 编程语言。
我有以下数据集:
my_data = data.frame(id = c(1,2,3,4,5), n = c(15,3,51,8,75))
我想创建一个新变量,它根据“n”的对应值为每一行生成一个随机整数。我尝试使用以下代码执行此操作:
my_data$rand = sample.int(my_data$n,1)
但这不起作用(相同的随机数重复 5 次)。
我也试过为此定义一个函数:
my_function <- function(x){sample.int(x,1)}
transform(my_data, new_column= my_function(my_data$n) )
但这也不起作用(相同的随机数再次重复 5 次)..
最后,我正在努力实现这样的目标:
my_data$rand = c(sample.int(15,1), sample.int(3,1), sample.int(51,1), sample.int(8,1), sample.int(75,1))
有人可以告诉我如何对更大的数据集执行此操作而不必手动指定每个“sample.int”命令吗?
谢谢!
我们可以使用 sapply
遍历 my_data
中的所有行,并在每次迭代中生成一个 sample.int
。
my_data$rand <- sapply(1:nrow(my_data), function(x) sample.int(my_data[x, 2], 1))
id n rand
1 1 15 7
2 2 3 2
3 3 51 28
4 4 8 6
5 5 75 9
当您说“基于 n
的值”时,您到底是什么意思?基于n
如何?
猜测#1:在每一行,你想抽取一个随机数,可能的值是 1 到 n
。
猜测#2:在每一行,你想为 0 到 1 之间的可能值绘制 n
个随机数。
第二个选项更难,但选项 #1 可以通过循环完成:
my_data = data.frame(id = c(1,2,3,4,5), n = c(15,3,51,8,75))
my_data$rand = NA
set.seed(123)
for(i in 1:nrow(my_data)){
my_data$rand[i] = sample(1:(my_data$n[i]), size = 1)
}
my_data
id n rand
1 1 15 15
2 2 3 3
3 3 51 51
4 4 8 6
5 5 75 67
您可以通过一次调用 runif()
、乘以 n
并向上舍入来高效地完成此操作:
transform(my_data, rand = ceiling(runif(n) * n))
id n rand
1 1 15 13
2 2 3 1
3 3 51 41
4 4 8 1
5 5 75 9