Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
一个用于创建data.frame并使列相互依赖的行_R_Dataframe - Fatal编程技术网

一个用于创建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

生成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<-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