【发布时间】:2017-08-14 13:16:07
【问题描述】:
我正在构建一个基于随机条目/行的数据框。这是创建随机条目的函数:
createRandomEntry <- function() {
names <- c('Dilbert', 'Wally', 'Alice', 'Ashok', 'Topper')
ages <- 30:45
return(
data.frame(
Name = sample(names, 1),
Age = sample(ages, 1),
stringsAsFactors = FALSE
)
)
}
现在我使用这个函数将它们组合成一个大的data.frame:
createRandomEntries <- function(n) {
df <- createRandomEntry()
for (i in 2:n) {
df <- rbind(df, createRandomEntry())
}
return(df)
}
从技术上讲,它运行良好,但由于多种原因有点笨拙:
- 我必须在两个地方调用
createRandomEntry()函数 - 我必须使用循环
- 循环必须从索引 2 开始,因为我已经获得了第一个条目
- 也许打电话给
rbind,这通常可能效率低下,我不知道...
在早期版本中,createRandomEntry() 返回 list 而不是 data.frame。然后我使用replicate() 创建一个矩阵,首先必须对其进行转置(通过调用t())才能从中创建一个data.frame。并且 data.frame 不可排序(错误:“'orderVector1' 中的未实现类型 'list'”)。在每一行上调用 unlist() 或从 createRandomEntry() 返回一个向量将解决排序问题,但我只会在每一列中获取字符串。
一定有更好的方法。但是怎么做呢?
编辑:拥有一个创建单个条目的函数很重要,因为一个条目的某些值可能相互关联,例如这个增强的函数显示:
createRandomEntry <- function() {
names <- c('Dilbert', 'Wally', 'Alice', 'Ashok', 'Topper')
ages <- 30:45
startedIn <- sample(1995:2005, 1)
lostMotivation <- startedIn + sample(1:3, 1)
return(
data.frame(
Name = sample(names, 1),
Age = sample(ages, 1),
StartYear = startedIn,
LostMotivation = lostMotivation,
stringsAsFactors = FALSE
)
)
}
createRandomEntries(3)
产生:
Name Age StartYear LostMotivation
1 Ashok 42 1998 2000
2 Dilbert 43 1997 1999
3 Dilbert 30 1996 1999
【问题讨论】:
-
do.call('rbind.data.frame', lapply(1:100, function(i) createRandomEntry())) -
想想
dplyr::rbind_list并将每个示例数据框保存到一个列表中,而不是一次又一次地覆盖您的data.frame。 -
@bouncyball,你打败了我,可能
do.call(rbind, lapply(1:100, createRandomEntry))也可以。
标签: r