一个用于创建data.frame并使列相互依赖的行
生成data.frames(特别是对于不可再现的SO问题)的一种常见情况是,一列依赖于另一列的(通常是随机)值。例如,如果想要在data.frame上测试回归,最好有一些噪声线性相关性:一个用于创建data.frame并使列相互依赖的行,r,dataframe,R,Dataframe,生成data.frames(特别是对于不可再现的SO问题)的一种常见情况是,一列依赖于另一列的(通常是随机)值。例如,如果想要在data.frame上测试回归,最好有一些噪声线性相关性: n <- 100 x <- runif(n) dat <- data.frame( x=x, y=x+runif(n) ) plot(y~x,data=dat) n这是我想到的最好的。它使用初学者经常犯的错误来编写更紧凑的代码 dat <- data.frame( x<-runi
n <- 100
x <- runif(n)
dat <- data.frame( x=x, y=x+runif(n) )
plot(y~x,data=dat)
n这是我想到的最好的。它使用初学者经常犯的错误来编写更紧凑的代码
dat <- data.frame( x<-runif(n), y=x+runif(n) )
由于local
的工作原理与evalq
类似(例如,它在给定环境中计算表达式),除了默认情况下通过new.env()
在新环境中计算外,x
是在新环境中创建的,而不是在全局环境中创建的。这里有一种方法不会破坏“每行一个任务”规则很多程序员都喜欢遵守:
within(data.frame(row.names = 1:n), {x = runif(n); y = x + runif(n)})
其中data.frame(row.names=1:n)
用于创建具有正确行数的空data.frame,否则中的会有问题。这里有一个解决方案,它既不存在您所识别的两个缺点
library(data.table)
n <- 100
dat <- data.table(x = runif(n))[, y := x + runif(n)]
库(data.table)
n这里有一个简单的解决方案,其中包含,
:
within(data.frame(x = runif(n)), y <- x + runif(n))
在(data.frame(x=runif(n)),y中有一个自定义函数,它的工作原理类似于transform
(或plyr::mutate
),但不需要初始数据帧(显然这对OP的问题没有帮助,因为没有人会有这个函数,但我认为其他人可能会感兴趣)
创建集合。需要种子
使随机数在任何情况下都可复制,但尝试以下操作的模除外:
set.seed(123)
dat <- transform(data.frame(x = runif(10)), y = x + runif(10))
此解决方案取决于已创建的x
。否则,R会抱怨。@SvenHohenstein,你是对的,我错过了。我用一个类似的替换了transform
,在版本中没有这个问题。plyr::mutate
的工作方式与转换相同,只是你可以引用你的列你可以修改你的代码来消除缺点:有很多创造性的答案,但我认为这和@WojciechSobala最接近我对世界的看法。
create <- function(...) {
.data <- list()
cols <- as.list(substitute(list(...))[-1])
cols <- cols[names(cols) != ""] # Silently drop unnamed columns
for(col in names(cols)) {
.data[[col]] <- eval(cols[[col]], .data, parent.frame())
}
as.data.frame(.data)
}
create(x = runif(1:10), y = x + 1)
set.seed(123)
dat <- transform(data.frame(x = runif(10)), y = x + runif(10))
> dat
x y
1 0.2875775 1.2444109
2 0.7883051 1.2416393
3 0.4089769 1.0865476
4 0.8830174 1.4556508
5 0.9404673 1.0433920
6 0.0455565 0.9453815
7 0.5281055 0.7741932
8 0.8924190 0.9344786
9 0.5514350 0.8793557
10 0.4566147 1.4111184