【问题标题】:need to reorganize data需要重新组织数据
【发布时间】:2015-05-27 03:48:10
【问题描述】:

我是 R 新手,有一个数据格式问题。 我需要改变它:

Poly Tran Strat Surv MALLP MALLS MALLG MALLF GADWP GADWS GADWG GADWF
AL    1    M      y     1    2    0      0     1     4     0     0
ARL   1    M      y     0    0    0      0     0     0     20    0
AM    1    M      y     0    0    0      0     0     0     0     0
AM    2    M      y     1    0    0      0     0     0     0     5

到这里:

Poly Tran Strat Surv  Spp   Num   Status
AL    1    M      y   mall   1      p
AL    1    M      y   mall   2      s
AL    1    M      y   gadw   1      p
AL    1    M      y   gadw   4      s
ARL   1    M      y   gadw   20     g
AM    2    M      y   mall   1      p
AM    2    M      y   gadw   5      f

我需要一些帮助!
谢谢。

【问题讨论】:

  • Status 变量从何而来?
  • @DominicComtois 是Spp的最后一个字母
  • 哦,我明白了,谢谢@StevenBeaupré

标签: r formatting data-management


【解决方案1】:

这里使用data.table:

dt.m = melt(dt, id=1:4, variable.name="Spp", value.name="Num")[Num != 0L]
dt.m[, c("Spp", "Status") := list(substring(Spp, 1, 4), substring(Spp, 5, 5))]

或者使用read.fwf:

dt.m = melt(dt, id=1:4, variable.name="Spp", value.name="Num", variable.factor = FALSE)
dt.m[Num != 0L][, c("Spp", "Status") := read.fwf(textConnection(Spp), widths=c(4,1))]

【讨论】:

    【解决方案2】:

    为了好玩,这里有一个基本的 R 方法。我已将“0”替换为NA,以便na.omit 可用于在stack 输入值之后“缩小”数据集。从那里,获取“spp”和“status”值是一些基本的gsubbing。

    within(na.omit(
      cbind(dat[1:4], 
            stack(replace(dat[-c(1:4)], dat[-c(1:4)] == 0, NA)))), {
              ind <- tolower(ind)
              spp <- gsub("(mall|gadw).*", "\\1", ind)
              status <- gsub("mall|gadw", "", ind)
              rm(ind)
            })
    #    Poly Tran Strat Surv values status  spp
    # 1    AL    1     M    y      1      p mall
    # 4    AM    2     M    y      1      p mall
    # 5    AL    1     M    y      2      s mall
    # 17   AL    1     M    y      1      p gadw
    # 21   AL    1     M    y      4      s gadw
    # 26  ARL    1     M    y     20      g gadw
    # 32   AM    2     M    y      5      f gadw
    

    订购非常简单,正如 Dominic 和 Steven 的回答所示。

    【讨论】:

      【解决方案3】:

      使用 base R 的解决方案(reshape2::melt 除外):

      dat2 <- reshape2::melt(dat, id.vars=c("Poly","Tran","Strat","Surv"))
      dat2 <- subset(dat2, subset = value > 0)
      dat2$variable <- as.character(dat2$variable)
      dat2$Status <- with(dat2, substr(tolower(variable), nchar(variable), nchar(variable)))
      dat2$variable <- with(dat2, substr(tolower(variable), 1, nchar(variable)-1))
      dat2 <- dat2[order(dat2$Tran),]
      colnames(dat2) <- c("Poly", "Tran", "Strat", "Surv", "Spp", "Num", "Status")
      rownames(dat2) <- NULL
      

      结果

      > dat2
      
        Poly Tran Strat Surv  Spp Num Status
      1   AL    1     M    y mall   1      p
      2   AL    1     M    y mall   2      s
      3   AL    1     M    y gadw   1      p
      4   AL    1     M    y gadw   4      s
      5  ARL    1     M    y gadw  20      g
      6   AM    2     M    y mall   1      p
      7   AM    2     M    y gadw   5      f
      

      数据

      dat <- read.csv(text = "Poly,Tran,Strat,Surv,MALLP,MALLS,MALLG,MALLF,GADWP,GADWS,GADWG,GADWF
      AL,1,M,y,1,2,0,0,1,4,0,0
      ARL,1,M,y,0,0,0,0,0,0,20,0
      AM,1,M,y,0,0,0,0,0,0,0,0
      AM,2,M,y,1,0,0,0,0,0,0,5")
      

      【讨论】:

      • 我认为 OP 希望通过 Tran 订购
      • reshape2::melt 不是基数 reshape(dat, idvar = names(dat)[1:4], direction = 'long', varying = list(names(dat)[5:12]), timevar = 'variable', v.names = 'value')
      • 不客气!不要忘记接受你最后选择的答案!
      【解决方案4】:

      使用dplyr 和tidyr 你可以这样做:

      library(tidyr)
      library(dplyr)
      
      df %>% gather(Spp, Num, -Poly, -Tran, -Strat, -Surv) %>%
        mutate(Status = tolower(substr(Spp, 5, 5)),
               Spp = tolower(substr(Spp, 1, 4))) %>%
        filter(!Num == 0) %>%
        arrange(Tran)
      

      这给出了:

      #  Poly Tran Strat Surv  Spp Num Status
      #1   AL    1     M    y mall   1      p
      #2   AL    1     M    y mall   2      s
      #3   AL    1     M    y gadw   1      p
      #4   AL    1     M    y gadw   4      s
      #5  ARL    1     M    y gadw  20      g
      #6   AM    2     M    y mall   1      p
      #7   AM    2     M    y gadw   5      f
      

      【讨论】:

      • 我比我更喜欢你的解决方案,我真的应该开始使用 dplyr(仍然有点抗拒)。
      猜你喜欢
      • 2020-11-25
      • 2022-11-12
      • 2013-08-21
      • 1970-01-01
      • 1970-01-01
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多