循环通过csv并转储到R中的数据框

时间:2014-07-15 15:55:43

标签: r loops csv dataframe reshape

使用R,我试图获取一个csv文件,循环它,提取值,并将它们转储到数据框中。 csv中有四列:ID,UG_inst,Freq和Year。具体来说,我希望每年按机构名称(2010-11,2011-12,2012-13和2013-14)遍历UG_inst列,并将该单元格的值放入R中的相应“单元格”中数据框。现在,csv只有一个Year列,但我创建的数据框每年都有一列。最终的想法是能够创建表示每个机构每年频率的条形图。目前,下面的代码抛出NO错误,但似乎对R数据帧“j”没有任何作用。

有几点需要注意:1)做一个嵌套的for循环让我的头旋转,所以我决定现在只使用2010-11,然后循环浏览机构名称。由于只有4年,我可以重写这四次,每次都有不同的年份。 2)此外,在csv中,有重复的名称。因此,如果机构名称出现两次(由于按字母顺序排列将在csv中相邻的行),有没有办法将这些的SUM转储到R中的数据框中?

以下所有相关信息。非常感谢您的帮助!!!!

以下是.csv文件的链接:https://www.dropbox.com/s/9et7muchkrgtgz7/UG_inst_ALL.csv

这是我正在尝试的R代码:

abc <- read.csv(insert file path to above csv here)

inst_string <- unique(abc$UG_inst)

j <- data.frame("UG_inst"=inst_string,"2010-11"=NA,"2011-12"=NA,"2012-13"=NA,"2013-14"=NA)

for (i in inst_string) {
    inst.index <- which(abc$UG_inst == i && abc$Year == "2010-11")
    j$X2010.11[j$Ug_inst==i] <- abc$Freq[inst.index]
                       }   

2 个答案:

答案 0 :(得分:1)

我建议使用基础R中的reshape()函数,而不是使用嵌套循环(或根本不使用循环)。

abc <- read.csv("UG_inst_ALL.csv")
abc <- abc[2:4]

reshape(data = abc,
        v.names = "Freq",
        timevar = "Year",
        idvar = "UG_inst",
        direction = "wide")

答案 1 :(得分:1)

这称为“重塑”您的数据,您将从“长”格式转变为“宽”格式。

除了基本R的reshape功能外,还有一些其他选项需要考虑。

我假设我们开始读取数据,如下所示。

abc <- read.csv("~/Downloads/UG_inst_ALL.csv", row.names = 1)
head(abc)
#                        UG_inst Freq    Year
# 1 Abilene Christian University    0 2010-11
# 2       Adams State University    0 2010-11
# 3               Adrian College    1 2010-11
# 4          Agnes Scott College    0 2010-11
# 5       Alabama A&M University    1 2010-11
# 6               Albion College    1 2010-11

选项1:xtabs

out <- as.data.frame.matrix(xtabs(Freq ~ UG_inst + Year, abc))
head(out)
#                              2010-11 2011-12 2012-13 2013-14
# Abilene Christian University       0       1       0       0
# Adams State University             0       0       0       1
# Adrian College                     1       0       0       0
# Agnes Scott College                0       0       1       0
# Alabama A&M University             1       3       1       2
# Albion College                     1       0       0       0

选项2:来自“reshape2”的<{1}}

dcast

选项3:来自“tidyr”的<{1}}

library(reshape2)
head(dcast(abc, UG_inst ~ Year, value.var = "Freq"))