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"
希望这对您有所帮助。
我是 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"
希望这对您有所帮助。