2016-11-03 4 views
0

データフレームを特定の形式に変換しようとしています。私はこれを達成するためにdplyr、reshape2などを使用しています。基本的には、次のようなデータフレームから始めます。Rのデータフレームの操作:可能であれば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 

私はこの「データ」データフレームを将来のために保持します。しかし、私は次のように(今「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 

フィルは必ずしも "グレー"であるとは限りません。しかし、特定のID変数(ID1、ID2など)の5つの行全体で同じ色にする必要があります。

私はこの目標を達成するために何かアドバイスしますか?

+2

melt' 'で試してみて、と' id.var'を使用する「ID」と '' すなわち 'ライブラリ(data.tableを)埋めるに答えます.var = c( "ID"、 "fill"))[order(ID)] ' – akrun

答えて

1
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 

そのは、文字ずつ行っているのでレベルID1、ID2とID10-と因子変数の包みデフォルトの順序は、ID1、ID10、ID2である、ので、発注のためgtoolsを使用する理由はあります。そのため、私はgtoolsのmixedorderを使用しなければなりませんでした。溶融(SETDT(データ)、ID;私は願っています

これはあなたの質問

0

未定義コード:datt %>% gather(key = key, value = value, -fill, -ID)

関連する問題