R:如何用随机字符串列创建一个 df
R: How to create a df with columns of random strings
我有一个 df,我希望其中一个列包含 1 到 100 之间的 5 个随机值的字符串:
expected_df <- data.frame("x" = stri_rand_strings(4, 8), "y" = round(runif(4, 13, 272)), z =(c('2 3 50 17 9', '10 3 5 100 22', '86 30 74 10 27', '6 33 4 19 66')))
我试图创建一个重复“1-100”5 次的函数,但是它为 df
中的每一行重复相同的 5 个数字
rand_str<- function() {
x = c(sample(1:100, 5, replace = FALSE))
return(paste0(x,collapse = " "))
}
df <- data.frame("x" = stri_rand_strings(4, 8), "y" = round(runif(4, 13, 272)), z =rep(rand_str(),4))
我尝试添加 rep(rand_str(),4),但它并没有解决问题。
如何创建 4 行,每行有 5 个不同的数字?
提前致谢!
这个怎么样?
rand_str <- function(n) {
returnvalue <- c()
for (i in 1:n) {
x = c(sample(1:100, 5, replace = FALSE))
returnvalue <- c(returnvalue, paste0(x, collapse = " "))
}
returnvalue
}
df <- data.frame("x" = stri_rand_strings(4, 8), "y" = round(runif(4, 13, 272)), z =rand_str(4))
您要找的函数是replicate
。使用 replicate
,您可以像这样使用原始 rand_str()
函数:
replicate(4, rand_str())
或者,您可以像这样重写 rand_str()
函数:
rand_str <- function(n) replicate(n, paste(sample(100, 5, FALSE), collapse=" "))
演示:
set.seed(1) # So you can replicate these results
rand_str(4)
# [1] "27 37 57 89 20" "90 94 65 62 6" "21 18 68 38 74" "50 72 98 37 75"
作为参考,如果您要使用 for
循环,则以下任一方法都比 Steffen 的答案更有效,Steffen 的答案会随着循环的每次迭代而增长一个向量。在 R 中,您应该预先分配 space 来存储循环的结果。如果可能,指定存储模式(例如,指定结果中需要 character
或 integer
的时间)将有助于提高函数的效率。
该选项在循环之前创建一个所需长度的空字符向量,循环的每次迭代都会用样本的粘贴结果替换给定位置的空向量。
rand_str <- function(n) {
returnvalue <- character(n)
for (i in 1:n) {
returnvalue[i] <- paste0(sample(1:100, 5, replace = FALSE), collapse = " ")
}
returnvalue
}
此选项创建一个空矩阵,其中每一行都存储样本的结果。填充矩阵后,使用通常用于将 data.frame
.
的行粘贴在一起的 do.call(paste, ...)
习惯用法将 paste
d 组合在一起。
rand_str <- function(n) {
m <- matrix(NA_integer_, ncol = 5, nrow = n)
for (i in seq.int(n)) {
m[i, ] <- sample(100, 5, FALSE)
}
do.call(paste, data.frame(m))
}
我有一个 df,我希望其中一个列包含 1 到 100 之间的 5 个随机值的字符串:
expected_df <- data.frame("x" = stri_rand_strings(4, 8), "y" = round(runif(4, 13, 272)), z =(c('2 3 50 17 9', '10 3 5 100 22', '86 30 74 10 27', '6 33 4 19 66')))
我试图创建一个重复“1-100”5 次的函数,但是它为 df
中的每一行重复相同的 5 个数字
rand_str<- function() {
x = c(sample(1:100, 5, replace = FALSE))
return(paste0(x,collapse = " "))
}
df <- data.frame("x" = stri_rand_strings(4, 8), "y" = round(runif(4, 13, 272)), z =rep(rand_str(),4))
我尝试添加 rep(rand_str(),4),但它并没有解决问题。
如何创建 4 行,每行有 5 个不同的数字?
提前致谢!
这个怎么样?
rand_str <- function(n) {
returnvalue <- c()
for (i in 1:n) {
x = c(sample(1:100, 5, replace = FALSE))
returnvalue <- c(returnvalue, paste0(x, collapse = " "))
}
returnvalue
}
df <- data.frame("x" = stri_rand_strings(4, 8), "y" = round(runif(4, 13, 272)), z =rand_str(4))
您要找的函数是replicate
。使用 replicate
,您可以像这样使用原始 rand_str()
函数:
replicate(4, rand_str())
或者,您可以像这样重写 rand_str()
函数:
rand_str <- function(n) replicate(n, paste(sample(100, 5, FALSE), collapse=" "))
演示:
set.seed(1) # So you can replicate these results
rand_str(4)
# [1] "27 37 57 89 20" "90 94 65 62 6" "21 18 68 38 74" "50 72 98 37 75"
作为参考,如果您要使用 for
循环,则以下任一方法都比 Steffen 的答案更有效,Steffen 的答案会随着循环的每次迭代而增长一个向量。在 R 中,您应该预先分配 space 来存储循环的结果。如果可能,指定存储模式(例如,指定结果中需要 character
或 integer
的时间)将有助于提高函数的效率。
该选项在循环之前创建一个所需长度的空字符向量,循环的每次迭代都会用样本的粘贴结果替换给定位置的空向量。
rand_str <- function(n) {
returnvalue <- character(n)
for (i in 1:n) {
returnvalue[i] <- paste0(sample(1:100, 5, replace = FALSE), collapse = " ")
}
returnvalue
}
此选项创建一个空矩阵,其中每一行都存储样本的结果。填充矩阵后,使用通常用于将 data.frame
.
do.call(paste, ...)
习惯用法将 paste
d 组合在一起。
rand_str <- function(n) {
m <- matrix(NA_integer_, ncol = 5, nrow = n)
for (i in seq.int(n)) {
m[i, ] <- sample(100, 5, FALSE)
}
do.call(paste, data.frame(m))
}