【问题标题】:Looping through csv and dumping to data frame in R循环通过csv并转储到R中的数据帧
【发布时间】:2014-09-05 22:04:22
【问题描述】:

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

【问题讨论】:

    标签: r loops csv dataframe reshape


    【解决方案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")
    

    【讨论】:

    • 超级骗子!!像魅力一样工作!谢谢!
    • 如果有效,请务必接受我的回答,以便人们看到问题已解决。
    【解决方案2】:

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

    除了基本 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”的dcast

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

    选项 3:来自“tidyr”的spread

    library(dplyr)
    library(tidyr)
    abc %>% select(-X) %>% group_by(UG_inst) %>% spread(Year, Freq)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-05
      • 1970-01-01
      • 2021-10-24
      • 2020-04-03
      • 2020-07-22
      • 1970-01-01
      • 1970-01-01
      • 2011-08-23
      相关资源
      最近更新 更多