在 R 中的循环中创建一个向量
Create a vector within a Loop in R
我有以下代码:
generator <- function(n){
nodes <- c()
distances <- c()
for (main in 1:n){
for (i in 1:n) {
for (j in 1:n){
if (main != i & i != j & main != j & i < j){
nodes <- c(nodes, paste(main, i, j, sep=",", collapse=""))
distances <- c(distances, main+i+j)}}}}
data <- data.frame(nodes, distances)
return(data)}
运行 generator(4),我得到以下输出:
nodes distances
1 1,2,3 6
2 1,2,4 7
3 1,3,4 8
4 2,1,3 6
5 2,1,4 7
6 2,3,4 9
7 3,1,2 6
8 3,1,4 8
9 3,2,4 9
10 4,1,2 7
11 4,1,3 8
12 4,2,3 9
我想要的是 "nodes" 列中的项目是值的实际向量,目的是比较不同的节点三元组并找到共同成员。它目前只是一个字符串。因此,例如,我希望 a$nodes[1][1]
产生 1
或类似的东西,这样我就可以从 nodes
三元组中提取每个单独的值。
我目前有 paste(main, i, j, sep=",")
,我尝试用 c(main, i, j)
替换它,但结果是我得到了一个 36 行而不是 12 行的数据框:每个单独的节点都是它自己的行。
谢谢。
您需要使用列表列来完成您想做的事情。
我建议使用 tibbles 而不是常规数据框,它们对于此类工作要方便得多。
如果您更愿意坚持使用基数 R
,您可以将 data <- tibble::tibble(nodes, distances)
替换为:
data <- data.frame(distances)
data$nodes <- nodes
新功能
generator <- function(n){
nodes <- list() # changed this from `c()` to `list()`
distances <- c()
for (main in 1:n){
for (i in 1:n) {
for (j in 1:n){
if (main != i & i != j & main != j & i < j){
nodes <- append(nodes, list(c(main, i, j))) # changed this to append a list instead of a vector
distances <- c(distances, main+i+j)}}}}
data <- tibble::tibble(nodes, distances) # changed `data.frame` to `tibble`
return(data)}
输出
df <- generator(4)
df
# A tibble: 12 x 2
# nodes distances
# <list> <int>
# 1 <int [3]> 6
# 2 <int [3]> 7
# 3 <int [3]> 8
# 4 <int [3]> 6
# 5 <int [3]> 7
# 6 <int [3]> 9
# 7 <int [3]> 6
# 8 <int [3]> 8
# 9 <int [3]> 9
# 10 <int [3]> 7
# 11 <int [3]> 8
# 12 <int [3]> 9
df$nodes[[1]]
# [1] 1 2 3
旁注
您正在增加一个列表,这可能会很慢,如果您 运行 遇到性能问题,请尝试用 nodes <- vector("list", length = max_length)
定义 nodes
并在最后定义 trim nodes <- nodes[lengths(nodes)!=0]
.
我有以下代码:
generator <- function(n){
nodes <- c()
distances <- c()
for (main in 1:n){
for (i in 1:n) {
for (j in 1:n){
if (main != i & i != j & main != j & i < j){
nodes <- c(nodes, paste(main, i, j, sep=",", collapse=""))
distances <- c(distances, main+i+j)}}}}
data <- data.frame(nodes, distances)
return(data)}
运行 generator(4),我得到以下输出:
nodes distances
1 1,2,3 6
2 1,2,4 7
3 1,3,4 8
4 2,1,3 6
5 2,1,4 7
6 2,3,4 9
7 3,1,2 6
8 3,1,4 8
9 3,2,4 9
10 4,1,2 7
11 4,1,3 8
12 4,2,3 9
我想要的是 "nodes" 列中的项目是值的实际向量,目的是比较不同的节点三元组并找到共同成员。它目前只是一个字符串。因此,例如,我希望 a$nodes[1][1]
产生 1
或类似的东西,这样我就可以从 nodes
三元组中提取每个单独的值。
我目前有 paste(main, i, j, sep=",")
,我尝试用 c(main, i, j)
替换它,但结果是我得到了一个 36 行而不是 12 行的数据框:每个单独的节点都是它自己的行。
谢谢。
您需要使用列表列来完成您想做的事情。
我建议使用 tibbles 而不是常规数据框,它们对于此类工作要方便得多。
如果您更愿意坚持使用基数 R
,您可以将 data <- tibble::tibble(nodes, distances)
替换为:
data <- data.frame(distances)
data$nodes <- nodes
新功能
generator <- function(n){
nodes <- list() # changed this from `c()` to `list()`
distances <- c()
for (main in 1:n){
for (i in 1:n) {
for (j in 1:n){
if (main != i & i != j & main != j & i < j){
nodes <- append(nodes, list(c(main, i, j))) # changed this to append a list instead of a vector
distances <- c(distances, main+i+j)}}}}
data <- tibble::tibble(nodes, distances) # changed `data.frame` to `tibble`
return(data)}
输出
df <- generator(4)
df
# A tibble: 12 x 2
# nodes distances
# <list> <int>
# 1 <int [3]> 6
# 2 <int [3]> 7
# 3 <int [3]> 8
# 4 <int [3]> 6
# 5 <int [3]> 7
# 6 <int [3]> 9
# 7 <int [3]> 6
# 8 <int [3]> 8
# 9 <int [3]> 9
# 10 <int [3]> 7
# 11 <int [3]> 8
# 12 <int [3]> 9
df$nodes[[1]]
# [1] 1 2 3
旁注
您正在增加一个列表,这可能会很慢,如果您 运行 遇到性能问题,请尝试用 nodes <- vector("list", length = max_length)
定义 nodes
并在最后定义 trim nodes <- nodes[lengths(nodes)!=0]
.