如何在R中的循环内创建循环

时间:2017-11-13 14:08:38

标签: r loops nested-loops

我是R的新手,我在关系循环中需要一些帮助。我需要从一个数据集中产生大量的表,我认为循环中的循环将解决问题,但是我在获得正确的结果时遇到了问题。

假设我有以下数据集:

var1 <- c("A","A","A","A","B","B","B","B")
var2 <- c(1,2,1,2,1,2,1,2)
df <- data.frame(var1,var2)

我想在4个表格中提取数据:

  • &#34; A&#34;的结果&安培; 1
  • &#34; A&#34;的结果&安培; 2
  • &#34; B&#34;的结果&安培; 1
  • &#34; B&#34;的结果&安培; 2

我有这个循环,但我无法得到4个表。任何人都可以帮忙!

for (i in df$var1) {

    dummy<- df%>%filter(var1 == i)

    for (j in dummy$var2) {

       nTab <- paste0("tab_", j, sep ="")
       assign(nTab, dummy%>%filter (var2 == j))

   }
}

2 个答案:

答案 0 :(得分:1)

扩展@Gregor的评论,以及这里的问题,

Save all data frames in list to separate .csv files

您可以使用Map()split()函数将新创建的数据框输出到各个csv文件:

代码:

s=split(df, f = paste(df$var1, df$var2, sep = "_"))
Map(write.csv,s, paste0("table_",names(s),".csv"),row.names=F)

会根据var1var2的值将csv写入您当前的工作目录,名称为&#34; table_A_1.csv&#34;等。

答案 1 :(得分:0)

我们可以根据两列将数据帧拆分为多个数据帧,并将它们存储在列表中。

df_list <- split(df, f = list(df$var1, df$var2))

df_list
# $A.1
#   var1 var2
# 1    A    1
# 3    A    1
# 
# $B.1
#   var1 var2
# 5    B    1
# 7    B    1
# 
# $A.2
#   var1 var2
# 2    A    2
# 4    A    2
# 
# $B.2
#   var1 var2
# 6    B    2
# 8    B    2

要在列表中保存数据框,我们可以进一步使用lapply函数。

lapply(names(df_list), function(x) write.csv(df_list[[x]], paste0(x, ".csv"), row.names = FALSE))

df_list[[x]]是基于名称访问单个数据帧的方式。 paste0(x, ".csv")是构建文件目录。