首页 > 解决方案 > 将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)

输出

标签: rdataframe

解决方案


你可以用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

推荐阅读