R中某些相关列的转置

Transpose of certain related columns in R

我是 R 的新手。我正在尝试转置数据框,但没有成功。尝试使用 t(dataframe)、melt(dataframe) 但没有得到我想要的输出。

原始数据框如下

CAT1   CAT2   VAL1   VAL2
A1     A2     BLUE   BLUE
B1     B2     GREEN  GREEN
C1     C2     BLUE   BLUE

我想以这种方式转置这个数据框,使其看起来像下面这样,并且 VAL1 和 VAL2 工作分组变量。

VAL    CAT

BLUE   A1    
       A2
BLUE   C1
       C2
GREEN  B1
       B2

我想知道这是否可以实现。

这是创建第一个数据集的代码:

dt <-data.frame('CAT1' = c('A1','B1','C1'),
                'CAT2' = c('A2','B2','C2'),
                'VAL1' = c('BLUE','RED','GREEN'),
                'VAL2' = c('BLUE','RED','GREEN'), stringsAsFactors = FALSE)

提前致谢。

我认为 reshape 会让你接近。

dt_long <- reshape(dt, varying = list(c('CAT1','CAT2'),
                                      c('VAL1','VAL2')), 
                       sep = "",
                       direction = "long")
dt_long
#    time CAT1  VAL1 id
#1.1    1   A1  BLUE  1
#2.1    1   B1   RED  2
#3.1    1   C1 GREEN  3
#1.2    2   A2  BLUE  1
#2.2    2   B2 BLACK  2
#3.2    2   C2   RED  3

现在您需要排除不需要的列,如 dt_long[, c("CAT1", "VAL1")] 所示。

此外,如果您的列名称为 la "CAT1, CAT2, ... CATn",而不是键入 n 个名称,请执行 paste0("CAT", 1:n).


更新

根据新要求,我们可以将列 VAL 创建为

dt_long$VAL <- c(rbind(unique(dt_long$VAL1), NA))
#    CAT1  VAL1   VAL
#1.1   A1  BLUE  BLUE
#1.2   A2  BLUE  <NA>
#2.1   B1   RED   RED
#2.2   B2   RED  <NA>
#3.1   C1 GREEN GREEN
#3.2   C2 GREEN  <NA>

此外,要生成向量 c("VAL11, VAL12, VAL21, VAL22, VAL31, VAL32") 我们可以做

paste0("VAL", c(sapply(1:3, paste0, 1:2)))
#[1] "VAL11" "VAL12" "VAL21" "VAL22" "VAL31" "VAL32"

希望这对您有所帮助。