如何根据 R 中的变量循环输入值将 for 循环的输出值添加到 data.frame?
How to add output values from a for-loop to a data.frame depending on the variable loop input values in R?
x <- 1
y <- 1
for (y in 1:2){
for (x in 1:2){
z <- x+y
zresults <- data.frame(x, y, z)
}
}
大家好,
抱歉我的转储问题,但我是 R 的新手,这实际上是我第一次尝试编写一些代码。
我用索引 x 和 y 创建了一个 for 循环,我想将输出值 (z) 与相应的 x 和 y 值一起保存在 data.frame 中。
发布的代码显然是错误的,但我不明白。
data.frame 应该是这样的:
x y z
1 1 1 2
2 2 1 3
3 1 2 3
4 2 2 4
提前谢谢大家!
来自德国的问候
这里有一种方法可以做您想做的事:
zresults <- expand.grid(x=1:2,y=1:2);
zresults$z <- zresults$x + zresults$y;
zresults;
## x y z
## 1 1 1 2
## 2 2 1 3
## 3 1 2 3
## 4 2 2 4
关于您尝试的说明:
-
x
和 y
的初始分配不是必需的。这些值在每个相应循环的第一次迭代中被 RHS 向量的第一个值覆盖(在每种情况下为 1
)。另外值得注意的是,与 C/C++ 和 Java 等语言不同,在 R 中您不必声明变量;任何变量名都可以随时赋值
- 在您的内部循环中,您正在分配
zresults
。第一次迭代后,您将覆盖 zresults
的先前值。如果您想 "build up" 一次 data.frame 一行,您可以使用以下解决方案,但请注意,这些方法的性能并不理想:
zresults[nrow(zresults)+1L,] <- c(x,y,z);
或
zresults <- rbind(zresults,c(x,y,z));
另请注意,zresults
必须在构建循环之前先进行初始化;例如:
zresults <- data.frame(x=integer(),y=integer(),z=integer());
- 一般来说,尽量避免在 R 中使用 for 循环。相反,矢量化是首选。这方面有很多很好的资料来源;例如,参见 http://www.noamross.net/blog/2014/4/16/vectorization-in-r--why.html and http://alyssafrazee.com/vectorization.html.
这是另一个解决方案
x = 1
y = 1
result = NULL
for (y in 1:2) {
for (x in 1:2) {
z = x + y
if (is.null(result)) {
result = data.frame(x,y,z)
} else {
result = rbind(result, data.frame(x,y,z))
}
}
}
result
x <- 1
y <- 1
for (y in 1:2){
for (x in 1:2){
z <- x+y
zresults <- data.frame(x, y, z)
}
}
大家好,
抱歉我的转储问题,但我是 R 的新手,这实际上是我第一次尝试编写一些代码。
我用索引 x 和 y 创建了一个 for 循环,我想将输出值 (z) 与相应的 x 和 y 值一起保存在 data.frame 中。 发布的代码显然是错误的,但我不明白。
data.frame 应该是这样的:
x y z
1 1 1 2
2 2 1 3
3 1 2 3
4 2 2 4
提前谢谢大家! 来自德国的问候
这里有一种方法可以做您想做的事:
zresults <- expand.grid(x=1:2,y=1:2);
zresults$z <- zresults$x + zresults$y;
zresults;
## x y z
## 1 1 1 2
## 2 2 1 3
## 3 1 2 3
## 4 2 2 4
关于您尝试的说明:
-
x
和y
的初始分配不是必需的。这些值在每个相应循环的第一次迭代中被 RHS 向量的第一个值覆盖(在每种情况下为1
)。另外值得注意的是,与 C/C++ 和 Java 等语言不同,在 R 中您不必声明变量;任何变量名都可以随时赋值 - 在您的内部循环中,您正在分配
zresults
。第一次迭代后,您将覆盖zresults
的先前值。如果您想 "build up" 一次 data.frame 一行,您可以使用以下解决方案,但请注意,这些方法的性能并不理想:
zresults[nrow(zresults)+1L,] <- c(x,y,z);
或
zresults <- rbind(zresults,c(x,y,z));
另请注意,zresults
必须在构建循环之前先进行初始化;例如:
zresults <- data.frame(x=integer(),y=integer(),z=integer());
- 一般来说,尽量避免在 R 中使用 for 循环。相反,矢量化是首选。这方面有很多很好的资料来源;例如,参见 http://www.noamross.net/blog/2014/4/16/vectorization-in-r--why.html and http://alyssafrazee.com/vectorization.html.
这是另一个解决方案
x = 1
y = 1
result = NULL
for (y in 1:2) {
for (x in 1:2) {
z = x + y
if (is.null(result)) {
result = data.frame(x,y,z)
} else {
result = rbind(result, data.frame(x,y,z))
}
}
}
result