如何根据 R 中的索引填充空数据框?
How do you fill in an empty data frame based on an index in R?
我正在尝试创建一个空数据框,然后根据这个 for 循环填充它。
我想要一个 5x10 维度的数据框,其中包含向量 A 和 B 中每个数字相乘的结果。
这是我希望最终数据框的样子。
到目前为止,我正在使用 for 循环来计算 2 个向量的乘积,但无法将我想要的结果插入到数据框中。
我哪里错了?
我的代码:
a <- c(1:10)
b <- c(1:5)
#Make a dummy dataframe filled with zeros, thats length(a) long and length(b) high
dummy <- as.data.frame(matrix(0, ncol=5, nrow=10))
heatmap_prep <- function(vector_a,vector_b){
for (i in 1:length(a)){
first_number <- a[i]
for(j in 1:length(b)){
second_number <- b[j]
result <- first_number*second_number
dummy [i,j] <- result
print(result)
}
}
}
谢谢!
函数不会修改函数之外的东西。您应该在函数内部创建 dummy
,并在函数末尾创建 return
最终修改版本:
heatmap_prep <- function(vector_a,vector_b){
dummy <- as.data.frame(matrix(0, ncol=length(vector_b), nrow=length(vector_a)))
for (i in 1:length(a)){
first_number <- a[i]
for(j in 1:length(b)){
second_number <- b[j]
result <- first_number*second_number
dummy [i,j] <- result
print(result)
}
}
return(dummy)
}
heatmap_prep(a, b)
# V1 V2 V3 V4 V5
# 1 1 2 3 4 5
# 2 2 4 6 8 10
# 3 3 6 9 12 15
# 4 4 8 12 16 20
# 5 5 10 15 20 25
# 6 6 12 18 24 30
# 7 7 14 21 28 35
# 8 8 16 24 32 40
# 9 9 18 27 36 45
# 10 10 20 30 40 50
然而,在这种情况下,内置的 outer
函数要简洁得多。输出是 matrix
,但您可以轻松地将其强制转换为 data.frame
。
outer(a, b)
# [,1] [,2] [,3] [,4] [,5]
# [1,] 1 2 3 4 5
# [2,] 2 4 6 8 10
# [3,] 3 6 9 12 15
# [4,] 4 8 12 16 20
# [5,] 5 10 15 20 25
# [6,] 6 12 18 24 30
# [7,] 7 14 21 28 35
# [8,] 8 16 24 32 40
# [9,] 9 18 27 36 45
# [10,] 10 20 30 40 50
你也可以把这个问题想象成矩阵乘法。这将给出相同的结果。
a %*% t(b)
我正在尝试创建一个空数据框,然后根据这个 for 循环填充它。
我想要一个 5x10 维度的数据框,其中包含向量 A 和 B 中每个数字相乘的结果。
这是我希望最终数据框的样子。
到目前为止,我正在使用 for 循环来计算 2 个向量的乘积,但无法将我想要的结果插入到数据框中。
我哪里错了?
我的代码:
a <- c(1:10)
b <- c(1:5)
#Make a dummy dataframe filled with zeros, thats length(a) long and length(b) high
dummy <- as.data.frame(matrix(0, ncol=5, nrow=10))
heatmap_prep <- function(vector_a,vector_b){
for (i in 1:length(a)){
first_number <- a[i]
for(j in 1:length(b)){
second_number <- b[j]
result <- first_number*second_number
dummy [i,j] <- result
print(result)
}
}
}
谢谢!
函数不会修改函数之外的东西。您应该在函数内部创建 dummy
,并在函数末尾创建 return
最终修改版本:
heatmap_prep <- function(vector_a,vector_b){
dummy <- as.data.frame(matrix(0, ncol=length(vector_b), nrow=length(vector_a)))
for (i in 1:length(a)){
first_number <- a[i]
for(j in 1:length(b)){
second_number <- b[j]
result <- first_number*second_number
dummy [i,j] <- result
print(result)
}
}
return(dummy)
}
heatmap_prep(a, b)
# V1 V2 V3 V4 V5
# 1 1 2 3 4 5
# 2 2 4 6 8 10
# 3 3 6 9 12 15
# 4 4 8 12 16 20
# 5 5 10 15 20 25
# 6 6 12 18 24 30
# 7 7 14 21 28 35
# 8 8 16 24 32 40
# 9 9 18 27 36 45
# 10 10 20 30 40 50
然而,在这种情况下,内置的 outer
函数要简洁得多。输出是 matrix
,但您可以轻松地将其强制转换为 data.frame
。
outer(a, b)
# [,1] [,2] [,3] [,4] [,5]
# [1,] 1 2 3 4 5
# [2,] 2 4 6 8 10
# [3,] 3 6 9 12 15
# [4,] 4 8 12 16 20
# [5,] 5 10 15 20 25
# [6,] 6 12 18 24 30
# [7,] 7 14 21 28 35
# [8,] 8 16 24 32 40
# [9,] 9 18 27 36 45
# [10,] 10 20 30 40 50
你也可以把这个问题想象成矩阵乘法。这将给出相同的结果。
a %*% t(b)