r - 将for循环中的多行输出保存到R中的对象
问题描述
如何将 for 循环的输出行保存到 R 对象?下面我尝试按组进行迭代,并将输出保存到 R 中的新数据框中。
我可以在控制台中打印输出,但无法将其保存到对象中。做这个的最好方式是什么?
#dataset
mat = matrix(1:30, nrow = 10, ncol = 3) #dataset values
group = c(1,1,1,2,2,2,3,3,3,3) #three groups
df = as.data.frame(cbind(mat, group)) #dataset to use
df[,1] = as.numeric(df[,1])
df[,2] = as.numeric(df[,2])
df[,3] = as.numeric(df[,3])
df[,4] = as.factor(df[,4])
#function
funk = function(x) {
V1 = mean(x[,1])
V2 = min(x[,2])
V3 = max(x[,3])
c(V1,V2,V3)
}
循环
#for loop
iterate <- function(x) {
z = levels(x[,4])
z = as.numeric(z)
for (i in z) {
y <- subset(x, x[,4] == i)
out <- funk(y)
out = as.data.frame(t(out))
print(out)
#!! how to save to an object with three rows (one for each group)
}
}
iterate(df)
输出
解决方案
你可以用dplyr
这个,
df %>%
group_by(group) %>%
summarize(V1 = mean(V1), V2 = min(V2), V3 = max(V3))
# # A tibble: 3 x 4
# group V1 V2 V3
# <fct> <dbl> <dbl> <dbl>
# 1 1 2 11 23
# 2 2 5 14 26
# 3 3 8.5 17 30
或者你可以用base R来做,不一定那么优雅:
do.call(
rbind,
by(df, df$group, FUN = function(z) data.frame(group = z$group[1], V1=mean(z$V1), V2=min(z$V2), V3=max(z$V3)))
)
# group V1 V2 V3
# 1 1 2.0 11 23
# 2 2 5.0 14 26
# 3 3 8.5 17 30
推荐阅读
- php - 从文件夹和数据库中删除。码虎
- ffmpeg - 如何在 gpu 的帮助下使用 ffmpeg 将 720p 文件转换为 360p
- embedded - 为什么 USB CDC 在接收数据时会挂起?
- python - 如何在 urllib3 python 中打印请求正文
- c# - 模拟数据库层,Oracle refCursor,我应该重构这个吗?
- visual-studio-code - 自上次编译以来,如何让 VS Code 跳过源文件而没有任何更改?
- docusignapi - Docusign Java 客户端 SDK 支持 JDK 1.8
- c++ - 为什么我会收到此运行时错误:'Solution::node' (solution.cpp) 类型的空指针内的成员访问
- python - 代码的问题是代码只为 i=0 运行一次。它不会为下一个索引重复。为什么?
- javascript - Highchart 饼图,解构 dataLabels 并定义自定义格式化程序