使用循环从多个数据帧的列中生成单个数据帧

时间:2018-03-16 15:20:41

标签: r loops

我想从多个数据帧中获取某些列并将它们组合成一个数据帧。我希望结合多天的歧视分数(每天都是自己的数据框)。我可以拥有超过30个数据框,并且手动写出每行代码都很痛苦,并且正在寻找更高效的东西。

这就是我一直在做的事情:

#Day 1
MTDay1 <- data.frame(MTD1$Animal.ID, MTD1$End.Summary...Corrects..1.)
MTDay1$Day <- "Day 1"
colnames(MTDay1) <- c("Subject",
                    "Correct",
                    "Day")

#Day3
MTDay3 <- data.frame(MTD3$Animal.ID, MTD3$End.Summary...Corrects..1.)
MTDay3$Day <- "Day 3"
colnames(MTDay3) <- c("Subject",
                      "Correct",
                      "Day")

#Day4
MTDay4 <- data.frame(MTD4$Animal.ID, MTD4$End.Summary...Corrects..1.)
MTDay4$Day <- "Day 4"
colnames(MTDay4) <- c("Subject",
                      "Correct",
                      "Day")


#Combine Days
MTdf <- rbind(MTDay1,
              MTDay3,
              MTDay4)

我想从每天获取Subject和Percent Correct列,并将它们组合成一个新的数据框。必须有一种更有效的方法来做到这一点,也许是一个循环?

任何信息都将不胜感激! 谢谢

1 个答案:

答案 0 :(得分:0)

考虑使用Dictionary<int, IDictionary<int, string>> items = viewModel.Items .GroupBy(t => t.Number) .ToDictionary(t => t.Key, t => (IDictionary<int, string>) t.ToDictionary(x => x.LanguageId, x => x.Translation)); eapply构建一个命名的数据框列表。然后使用mget以元素方式遍历列表的名称和数据框元素。另外,为Map中的每一列命名。最后,运行data.frame以对新列表的所有数据框元素进行rowbind。

do.call

或者,将源文件读入命名列表并使用# EQUIVALENT CALLS (CHOOSE EITHER) df_list <- eapply(.GlobalEnv, function(d) d)[c("MTD1", "MTD2", "MTD3", ...)] df_list <- mget(c("MTD1", "MTD2", "MTD3", ...)) df_process <- function(name, df) { # ASSIGN NAMED COLUMNS IN data.frame CALL data.frame(Subject = df$Animal.ID, Correct = df$End.Summary, #... other columns ..., Day = gsub("MTD", "Day ", name)) } new_list <- Map(df_process, names(df_list), df_list) MTdf <- do.call(rbind, new_list) 从问题文件中输出空数据帧。

tryCatch