【问题标题】:How to create a loop inside a loop in R如何在R中的循环内创建循环
【发布时间】:2017-11-13 14:08:38
【问题描述】:

我是 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个表中的数据:

  • “A”和 1 的结果
  • “A”和 2 的结果
  • “B”和 1 的结果
  • “B”和 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))

   }
}

【问题讨论】:

  • 您在寻找xtabs(~ var1 + var2, data=df) 吗?
  • 循环是一种不好的方法 - 看起来你想要split(df, f = paste(df$var1, df$var2, sep = "_"))
  • 我需要创建几个数据框以导出到 csv。每个组合 var1 和 var2 一个。
  • 感谢 Gregor 和 jogo!

标签: r loops nested-loops


【解决方案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 写入您当前的工作目录,名称为“table_A_1.csv”等。

【讨论】:

  • 感谢安德鲁·海恩斯!我用过那个解决方案。
  • 干杯布鲁诺,如果它解决了您的问题,请接受它作为答案,以便其他人可以看到问题有答案! :)
【解决方案2】:

我们可以根据两列将数据框拆分为若干个数据框,并将它们存储在一个列表中。

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")是构造文件目录。

【讨论】:

  • @BrunoGuarita 我很高兴它有帮助。如果可能,接受我的回答或 Andrew Haynes 的回答取决于您认为哪一个对您最有帮助或最有用。它会让其他人知道这个问题有解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-11
  • 2020-09-16
  • 1970-01-01
  • 1970-01-01
  • 2016-10-17
  • 2014-06-19
  • 1970-01-01
相关资源
最近更新 更多