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 来存储循环的结果。如果可能,指定存储模式(例如,指定结果中需要 characterinteger 的时间)将有助于提高函数的效率。

该选项在循环之前创建一个所需长度的空字符向量,循环的每次迭代都会用样本的粘贴结果替换给定位置的空向量。

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, ...) 习惯用法将 pasted 组合在一起。
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))
}