[英]Trying to create a dataframe as result of a 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 %>% summarise(oldSum = sum(Sepal.Length))
df <- cbind(variation[i], oldSum, newSum)
z <- rbind(df)
print(z)
}
我得到的输出是:
variation[i] oldSum newSum
1 0.1 876.5 891.5
variation[i] oldSum newSum
1 0.6 876.5 966.5
variation[i] oldSum newSum
1 1.1 876.5 1041.5
variation[i] oldSum newSum
1 1.6 876.5 1116.5
variation[i] oldSum newSum
1 2.1 876.5 1191.5
variation[i] oldSum newSum
1 2.6 876.5 1266.5
我想要的输出是:
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,它将仅返回该数据帧。 尝试rbind(z,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
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.