【问题标题】:Combine large number of columns in R合并R中的大量列
【发布时间】:2011-12-02 17:21:34
【问题描述】:

我有一个包含以下列的数据集

C1, V1, C2, V2, C3, V3.........C1000, V1000

所有列都有相同数量的观察(行)。

如何将上述数据组合成一个新数据集,其中只有一个 C、V 列,其中包含长格式数据集的所有行作为行?

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    劫持@Jorans 的答案,我会试试的。

    rs <- data.frame(C = unlist(dat[, grep("C",names(dat))]),
                     V = unlist(dat[, grep("V",names(dat))]))
    

    这将覆盖你,以防你的 C 和 V 不交替。

    【讨论】:

      【解决方案2】:

      你也可以直接使用baseR中的reshape函数,我用的是和@Kohske一样的例子

      reshape(d, direction = 'long', varying = 1:NCOL(d), sep = "")
      

      【讨论】:

      • +1 很棒。我总是无法使用reshape。对我来说太复杂了。
      【解决方案3】:

      这是一个使用 plyr 和 reshape2 包的示例:

      > # sample data
      > d <- data.frame(matrix(runif(100), 5, 20))
      > names(d) <- paste(c("C", "V"), rep(1:10, each = 2), sep = "")
      > d
               C1         V1        C2        V2         C3        V3          C4         V4        C5         V5        C6        V6         C7        V7         C8
      1 0.1867699 0.93659453 0.1197284 0.9628986 0.52336647 0.9650141 0.651377738 0.90073030 0.2559667 0.91905240 0.3563512 0.6935289 0.43179306 0.6400699 0.61515316
      2 0.7576912 0.30851077 0.8677065 0.4920025 0.51844891 0.1035328 0.338086219 0.49316520 0.2735068 0.31079714 0.7707765 0.7829738 0.18611600 0.4998730 0.31711230
      3 0.8104602 0.51727882 0.4034713 0.4545304 0.07993988 0.3806043 0.361723985 0.91731069 0.7836848 0.51605825 0.1664879 0.9997097 0.60784616 0.7576581 0.07144218
      4 0.6629312 0.78566815 0.3091202 0.6267486 0.04399409 0.5988425 0.001489632 0.15462250 0.6210522 0.51142738 0.2298060 0.8632633 0.01202089 0.6192330 0.61705098
      5 0.3714499 0.03534432 0.1200033 0.5566100 0.15498809 0.7600497 0.668615795 0.07763992 0.1017358 0.07118067 0.4254473 0.5877628 0.20763356 0.7201208 0.56749348
               V8        C9        V9       C10       V10
      1 0.4997906 0.1539158 0.5079096 0.4153216 0.5391126
      2 0.8372036 0.4995961 0.2236440 0.5060925 0.3148300
      3 0.9487363 0.5366132 0.3454843 0.8130159 0.6747609
      4 0.8924971 0.6801537 0.1349331 0.5654011 0.4541599
      5 0.5704078 0.5948960 0.6172788 0.3661633 0.9945200
      > 
      > # load library
      > library(reshape2)
      > library(plyr)
      > 
      > # make obs. id
      > d$id <- 1:nrow(d)
      > 
      > # melt it to longest format (i.e., 1 obs / 1 row)
      > d2 <- melt(d, id = "id")
      > 
      > # split label into C/N and number
      > d3 <- mutate(d2,
      +              N = substr(variable, 1, 1),
      +              i = as.integer(substr(variable, 2, 100)),
      +              variable = NULL)
      >              
      > # reshape and order the data             
      > d4 <- dcast(d3, id+i~N, value_var = "value")
      > d4$id <- NULL
      > id <- arrange(d4, i)
      > head(d4)
        i         C         V
      1 1 0.1867699 0.9365945
      2 2 0.1197284 0.9628986
      3 3 0.5233665 0.9650141
      4 4 0.6513777 0.9007303
      5 5 0.2559667 0.9190524
      6 6 0.3563512 0.6935289
      

      【讨论】:

        【解决方案4】:

        假设您的列确实在 C 和 V 之间交替,并且您当前的数据框存储在 dat 中,这样的事情应该可以工作:

        rs <- data.frame(C = unlist(dat[, seq(1,2000,by = 2)]),
                         V = unlist(dat[, seq(2,2000,by = 2)]))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-16
          • 1970-01-01
          相关资源
          最近更新 更多