R 中数据框的操作:可能使用 dplyr 和 reshape2

Manipulation of data frame in R: possibly using dplyr and reshape2

我正在尝试将数据框转换为特定格式。我一直在使用 dplyr、reshape2 等来完成这个。基本上,我从如下数据框开始:

library(dplyr)
library(plotly)
library(data.table)
library(reshape2)

set.seed(1)
data <- data.frame(ID = paste0("ID",1:10), A = runif(10), B = runif(10), C = runif(10), D = runif(10), E = runif(10), fill = factor(rep("gray", 10), levels = c("gray", palette)))
data$ID <- as.character(data$ID)

这将创建以下格式的数据框。

   ID         A         B         C         D         E fill
1 ID1 0.2655087 0.2059746 0.9347052 0.4820801 0.8209463 gray
2 ID2 0.3721239 0.1765568 0.2121425 0.5995658 0.6470602 gray
3 ID3 0.5728534 0.6870228 0.6516738 0.4935413 0.7829328 gray
4 ID4 0.9082078 0.3841037 0.1255551 0.1862176 0.5530363 gray
5 ID5 0.2016819 0.7698414 0.2672207 0.8273733 0.5297196 gray
6 ID6 0.8983897 0.4976992 0.3861141 0.6684667 0.7893562 gray

我将保留此 "data" 数据框以供将来使用。但我需要重新排列它以创建一个新的数据框(现在称为 "dat_long"),如下所示:

datt <- data.frame(t(data))
names(datt) <- as.matrix(datt[1, ])
datt <- datt[-1, ]
datt[] <- lapply(datt, function(x) type.convert(as.character(x)))
setDT(datt, keep.rownames = TRUE)[]
colnames(datt)[1] <- "x"
dat_long <- melt(datt, id.vars ="x" )

这导致以下结构:

head(dat_long,12)
       x variable      value
 1:    A      ID1 0.26550866
 2:    B      ID1  0.2059746
 3:    C      ID1 0.93470523
 4:    D      ID1  0.4820801
 5:    E      ID1  0.8209463
 6: fill      ID1       gray
 7:    A      ID2 0.37212390
 8:    B      ID2  0.1765568
 9:    C      ID2 0.21214252
10:    D      ID2  0.5995658
11:    E      ID2  0.6470602
12: fill      ID2       gray

这就是差不多我想要的数据框了。然而,我真正想要的是如下所示:

head(dat_long,12)
       x variable      value fill
 1:    A      ID1 0.26550866 gray
 2:    B      ID1  0.2059746 gray
 3:    C      ID1 0.93470523 gray
 4:    D      ID1  0.4820801 gray
 5:    E      ID1  0.8209463 gray
 6:    A      ID2 0.37212390 gray
 7:    B      ID2  0.1765568 gray
 8:    C      ID2 0.21214252 gray
 9:    D      ID2  0.5995658 gray
10:    E      ID2  0.6470602 gray

填充可能并不总是 "gray"。但对于给定的 ID 变量(ID1、ID2 等),所有五行的颜色应该相同。

为了实现这个目标,您有什么建议吗?

未经测试的代码:datt %>% gather(key = key, value = value, -fill, -ID).

library(dplyr)
library(plotly)
library(data.table)
library(reshape2)

set.seed(1)
data <- data.frame(ID = paste0("ID",1:10), A = runif(10), B = runif(10), C =    runif(10),
               D = runif(10), E = runif(10),
               fill = factor(rep("gray", 10), levels = c("gray", palette)))
data$ID <- as.character(data$ID)

install.packages("gtools")
library(gtools)

data2 <- melt(data, id.vars = c("ID", "fill"),measure.vars = c("A","B","C","D","E"))
data3 <- data2[mixedorder(data2$ID),]

> head(data3,15)
     ID fill variable     value
 1: ID1 gray        A 0.2655087
 2: ID1 gray        B 0.2059746
 3: ID1 gray        C 0.9347052
 4: ID1 gray        D 0.4820801
 5: ID1 gray        E 0.8209463
 6: ID2 gray        A 0.3721239
 7: ID2 gray        B 0.1765568
 8: ID2 gray        C 0.2121425
 9: ID2 gray        D 0.5995658
10: ID2 gray        E 0.6470602
11: ID3 gray        A 0.5728534
12: ID3 gray        B 0.6870228
13: ID3 gray        C 0.6516738
14: ID3 gray        D 0.4935413
15: ID3 gray        E 0.7829328

使用 gtools 进行排序的原因是,对于级别为 ID1、ID2 和 ID10 的因子变量,默认排序为 ID1、ID10、ID2,因为它是逐字符完成的。因此我不得不使用 gtools 中的 mixedorder。

我希望这能回答你的问题