【问题标题】:Data transformation in RR中的数据转换
【发布时间】:2014-04-03 13:47:40
【问题描述】:

我正在寻找一个用于转换数据框的 R 示例。 我有一个包含 100 行的数据框(每个美国州 2 行)

     Status  State Count 
     default    AK   15
     nodefault  AK   71
     default    AL   56
     nodefault  AL  428
     default    AR   33
     nodefault  AR  228
     default    AZ  132
     nodefault  AZ  801
     ......
     ......

我想要的转换是一个有 50 行的数据框:

      State Count1  Count2 
        AK   15       71
        AL   56      428
        AR   33      228
        AZ  132      801
       .... 

您能建议任何 R 函数来进行这种转换吗?

我尝试使用“聚合”功能。但是,它需要一个参数,例如:'mean' OR 'Sum',我不想要 mean 或 sum。

感谢您提供的任何帮助。

【问题讨论】:

    标签: r transform


    【解决方案1】:

    使用 reshape2 包中的 dcast 函数

    require(reshape2)
    DB2 <- dcast(DB, State ~ Status, value.var="Count")
    colnames(DB2) <- c("State", "Count1", "Count2")
    

    【讨论】:

    • 您可能还需要重命名列。
    • 对,我忘了。谢谢!
    【解决方案2】:

    这里有几种可能性:

    1) xtabs

    > xtabs(Count ~ State + Status, DF)
         Status
    State default nodefault
       AK      15        71
       AL      56       428
       AR      33       228
       AZ     132       801
    

    2) 点按

    > tapply(DF[[3]], DF[2:1], c)
         Status
    State default nodefault
       AK      15        71
       AL      56       428
       AR      33       228
       AZ     132       801
    

    3) 重塑

    > reshape(data = DF, dir = "wide", idvar = "State", timevar = "Status")
      State Count.default Count.nodefault
    1    AK            15              71
    3    AL            56             428
    5    AR            33             228
    7    AZ           132             801
    

    reshape2 包中的dcast 是另一种可能的工作方式,有点像reshape

    4) read.zoo

    > library(zoo)
    >
    > read.zoo(DF, index = "State", split = "Status", FUN = identity)
       default nodefault
    AK      15        71
    AL      56       428
    AR      33       228
    AZ     132       801
    

    5) 拆分/合并

    > do.call("merge", c(unname(split(DF, DF$Status)), by = 2))[c(-2, -4)]
      State Count.x Count.y
    1    AK      15      71
    2    AL      56     428
    3    AR      33     228
    4    AZ     132     801
    

    这也可以表示为:

    s <- split(DF, DF$Status)
    merge(s[[1]], s[[2]], by = 2)[c(-2, -4)]
    

    with(split(DF, DF$Status), merge(default, nodefault, by = 2))[c(-2, -4)]
    

    添加解决方案 5.

    【讨论】:

      猜你喜欢
      • 2021-08-29
      • 1970-01-01
      • 2017-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-11
      相关资源
      最近更新 更多