【问题标题】:Stack 10 Columns in R in to two columns [duplicate]将R中的10列堆叠成两列[重复]
【发布时间】:2016-02-27 06:15:55
【问题描述】:

我无法将 R 中的 10 列堆叠成两列,每列 5 列,每列都相关。基本上我有类似的东西:

名称1,ID1,名称2,ID2,名称3,ID3,名称4,ID4,名称5,ID5

我需要将它们堆叠到一个名称和 ID 表中,其中每个名称列中的值仍然与其对应的 ID 匹配。解决这个问题的最佳方法是什么?

谢谢!

【问题讨论】:

标签: r reshape data-manipulation


【解决方案1】:

你可以通过重塑来做到这一点

library(dplyr)
library(tidyr)
library(rex)

variable_regex =
  rex(capture("Name" %>% 
                or ("ID") ),
      capture(digits) )

mydf %>%
  mutate(row_ID = 1:n()) %>%
  gather(variable, value, -row_ID) %>%
  extract(variable,
           c("new_variable", "column_ID"),
           variable_regex) %>%
  spread(new_variable, value)

【讨论】:

  • 我完全误读了这个问题。我添加了一个新的解决方案。
【解决方案2】:

我会推荐来自“data.table”包的melt

这是一些示例数据。 (这是应该分享的东西。)

mydf <- data.frame(
  matrix(1:20, ncol = 10, dimnames = list(NULL, paste0(c("Name", "ID"), 
                                                       rep(1:5, each = 2)))))

mydf
##   Name1 ID1 Name2 ID2 Name3 ID3 Name4 ID4 Name5 ID5
## 1     1   3     5   7     9  11    13  15    17  19
## 2     2   4     6   8    10  12    14  16    18  20

这是重塑:

library(data.table)
melt(as.data.table(mydf), measure = patterns("Name", "ID"), 
     value.name = c("Name", "ID"))
##     variable Name ID
##  1:        1    1  3
##  2:        1    2  4
##  3:        2    5  7
##  4:        2    6  8
##  5:        3    9 11
##  6:        3   10 12
##  7:        4   13 15
##  8:        4   14 16
##  9:        5   17 19
## 10:        5   18 20

【讨论】:

  • 也可以使用setDT(mydf) 代替as.data.table 的强制。可能值得注意:reshape2 melt 没有patterns,所以不能在这里替代。
  • @Frank,我知道setDT,但我发现有足够多的人对他们的数据从data.frame 更改为我通常不使用的data.table 感到惊讶它在答案中。
猜你喜欢
  • 2013-04-01
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 2012-11-15
  • 1970-01-01
  • 1970-01-01
  • 2020-02-06
  • 2020-11-12
相关资源
最近更新 更多