从函数生成数据帧长度(和列数据)

时间:2016-08-13 08:38:11

标签: r

我想生成一个随机长度的数据框。

> head(df)
"id"    "age"
53      12        # randomly chosen data from fn1(){} and fn2(){}
146     31        #
343     22        #
...#randomly generated length from sample(50:5000,1)

问题在于我尝试的方式只是一遍又一遍地重复相同的元素:

# This just repeats the same value instead of generating function over and over
a <- fn1(){}
rep(a,15)
[1] "S" "S" "S" "S" "S" "S" "S" ...

理想情况下,我想指定的列名称并从其他函数中分配值:

# Generate length of data frame
df.length <- sample(50:500,1)

# Generate data for each row from function
df.column.id <- fn1(){}
df.column.age <- fn2(){}
...

df <- data.frame("id" = df.column.id, "age" = df.column.age, ...)

不幸的是,rep函数不起作用,那么如何从函数生成数据框列?我也尝试matrix(data = c(df.column.id, df.column.age), nrow = df.length)没有按预期工作。

编辑:

replicate(10,RandomStatusColor(),simplify =&#34; vector&#34;)正在生成函数输出的向量。

2 个答案:

答案 0 :(得分:1)

也许这样的事情会有所帮助:

min_rownum <- 10
max_rownum <- 50
num_of_rows <- sample(seq(min_rownum, max_rownum), 1)
min_age <- 1 
max_age <- 50
age <- sample(seq(min_age, max_age), num_of_rows, replace = TRUE)
min_ID <- 50
max_ID <- 500
id <- sample(seq(min_ID, max_ID), num_of_rows)
df1 <- data.frame(id, age)

我尝试使用会使代码不言自明的变量名。

replace = TRUE函数中的参数sample()表示可以多次选择元素。在年龄的情况下,这似乎是合理的,而ID应该是唯一的。 sample()的第二个参数定义了从作为第一个参数传递的向量中选择的元素数量。

问题的标题表明data.frame应该由函数生成。在这种情况下,上面的代码可以包装成这样的函数:

make_random_df <- function(min_rownum=10, max_rownum=50, min_age=1, max_age=50,
                       min_ID=50, max_ID=500) {
  num_of_rows <- sample(seq(min_rownum, max_rownum), 1)
  age <- sample(seq(min_age, max_age), num_of_rows, replace = TRUE)
  id <- sample(seq(min_ID, max_ID), num_of_rows)
  df1 <- data.frame(id, age)
}

使用此功能,可以使用

创建data.frame
my_random_df <- make_random_df()
#> head(my_random_df)
#   id age
#1 461   7
#2  86  44
#3 319   8
#4 363  45
#5  59   3
#6 258  49

答案 1 :(得分:1)

这是一个从给定向量(len)生成给定长度(vec)的数据样本的函数:

createData <- function(vec, len) {
  sample(vec, len, replace = TRUE)
}

nobs <- 20

df <- data.frame(id = createData(vec = c("a", "b", "c"), len = nobs),
                 age = createData(vec = seq(10, 50, 10), len = nobs))

df

这就是你想要的吗?