R 尝试创建数据帧作为循环的结果

R 尝试创建数据帧作为循环的结果,r,for-loop,R,For Loop,我试图创建一个数据帧,它是循环的结果: variation <- seq(0.10, 3, 0.5) for (i in seq_along(variation)) { x <- iris %>% mutate(newLength = Sepal.Length + variation[i]) newSum <- x %>% summarise(newSum = sum(newLength)) oldSum <- iris %>% summar

我试图创建一个数据帧,它是循环的结果:

variation <- seq(0.10, 3, 0.5)
for (i in seq_along(variation)) {
  x <- iris %>% mutate(newLength = Sepal.Length + variation[i])
  newSum <- x %>% summarise(newSum = sum(newLength))
  oldSum <- iris %>% summarise(oldSum = sum(Sepal.Length))

  df <- cbind(variation[i], oldSum, newSum)
  z <- rbind(df)
  print(z)
}
我期望的输出是:

 variation[i] oldSum newSum
         0.1  876.5  891.5
         0.6  876.5  966.5
         1.1  876.5 1041.5
         1.6  876.5 1116.5
         2.1  876.5 1191.5
         2.6  876.5 1266.5

我做错了什么?

rbind将多行绑定在一起。如果只给它一个df,它将返回该数据帧。尝试rbindz,df将新的df附加到旧的z

variation <- seq(0.10, 3, 0.5)
for (i in seq_along(variation)) {
  x <- iris %>% 
    mutate(newLength = Sepal.Length + variation[i])
newSum <- x %>% 
    summarise(newSum = sum(newLength))
oldSum <- iris %>% 
  summarise(oldSum = sum(Sepal.Length))    
df <- cbind(variation[i], oldSum, newSum)
z <- rbind(z,df)
print(z)
}

请注意,z不会被清除,因此您可能希望在开始循环之前对其进行初始化。类似于z=NULL的东西可以确保它是空的。

rbind将多行绑定在一起。如果只给它一个df,它将返回该数据帧。尝试rbindz,df将新的df附加到旧的z

variation <- seq(0.10, 3, 0.5)
for (i in seq_along(variation)) {
  x <- iris %>% 
    mutate(newLength = Sepal.Length + variation[i])
newSum <- x %>% 
    summarise(newSum = sum(newLength))
oldSum <- iris %>% 
  summarise(oldSum = sum(Sepal.Length))    
df <- cbind(variation[i], oldSum, newSum)
z <- rbind(z,df)
print(z)
}

请注意,z不会被清除,因此您可能希望在开始循环之前对其进行初始化。类似于z=NULL的函数可以确保它是空的。

您应该尝试像outer这样的向量化函数来完成分析的主要复杂部分:

data.frame(
  variation,
  oldSum=sum(iris$Sepal.Length),
  newSum=colSums(outer(iris$Sepal.Length, variation, FUN=`+`))
)

#  variation oldSum newSum
#1       0.1  876.5  891.5
#2       0.6  876.5  966.5
#3       1.1  876.5 1041.5
#4       1.6  876.5 1116.5
#5       2.1  876.5 1191.5
#6       2.6  876.5 1266.5
正如@Frank所指出的,您可以进一步简化/加速:

sum.sl <- sum(iris$Sepal.Length)
data.frame(
  variation,
  oldSum=sum.sl,
  newSum=sum.sl + length(iris$Sepal.Length)*variation
)

您应该尝试使用像outer这样的矢量化函数来完成分析的主要复杂部分:

data.frame(
  variation,
  oldSum=sum(iris$Sepal.Length),
  newSum=colSums(outer(iris$Sepal.Length, variation, FUN=`+`))
)

#  variation oldSum newSum
#1       0.1  876.5  891.5
#2       0.6  876.5  966.5
#3       1.1  876.5 1041.5
#4       1.6  876.5 1116.5
#5       2.1  876.5 1191.5
#6       2.6  876.5 1266.5
正如@Frank所指出的,您可以进一步简化/加速:

sum.sl <- sum(iris$Sepal.Length)
data.frame(
  variation,
  oldSum=sum.sl,
  newSum=sum.sl + length(iris$Sepal.Length)*variation
)

谢谢!但是上面的脚本生成我想要的输出6次。它应该只有一个。您将print命令放在循环中,因此它将每次打印6次,其中将有一个额外的行。如果您只想打印一次,请将printz放在for循环之外。谢谢!但是上面的脚本生成我想要的输出6次。它应该只有一个。您将print命令放在循环中,因此它将每次打印6次,其中将有一个额外的行。如果只想打印一次,请将printz放在for循环之外。因为outer会占用内存,我可能会从colSumsouterx,y,`+`切换到sumx+lengthx*y,也称为oldSum+lengtholdSum*variation@Frank-是的,在数字变得相当大之前,这不太重要,但是你的例子肯定更简单/更快,并且允许更好地重构代码。因为外部会占用内存,我可能会从colSumsouterx,y,`+`切换到sumx+lengthx*y,也就是oldSum+lengtholdSum*variation@Frank-是的,在数字变得相当大之前,这不太重要,但是您的示例当然更简单/更快,并且允许更好地重构代码。