2017-09-07 6 views
1

列の値2と-2に基づいて入力データを変換します。結果は次のようになります。列内の特定の値に基づいて入力データを変換する方法は?

Input: 

Symbol S1 S2 S3 S4 S5 
ATAC  0  1 -1 -2 2 
BHGV  1  1 -2 2 0 
CCNL  2 -2  1 0 1 
AGRN  0  2 -2 0 1 

Result: 

S1 2 CCNL 
S2 -2 CCNL 
S2 2 AGRN 
S3 -2 BHGV 
S3 -2 AGRN 
S4 -2 ATAC 
S4 2 BHGV 
S5 2 ATAC 

ありがとうございました!

+2

melt' 'で試してみてくださいを行うことができますすなわち、 'ライブラリ(reshape2);溶融(df1、id.var ="シンボル ")' – akrun

答えて

1

akrunは少し速かったです。編集に関する

library(data.table) 
data <- fread(" 
     Symbol S1 S2 S3 S4 S5 
     ATAC  0  1 -1 -2 2 
     BHGV  1  1 -2 2 0 
     CCNL  2 -2  1 0 1 
     AGRN  0  2 -2 0 1 
     ") 

melted <- melt(data, id.var = "Symbol") 
melted <- melted[abs(melted$value) == 2, ] 

:彼はポスト、ここに完全な答えdoesntの場合stackcbindと塩基Rで

melted[melted == 2] <- "TWO" 
melted[melted == -2] <- "MTWO" 
+0

ねえありがとうございました。私は2を "TWO"、-2を "MTWO"と名づけたいと思います。私はこれを行う方法も知っていますか?あなたが私にこれを質問に入れさせたいなら、私はそれをします。ありがとうございました !! – raju

+1

確かに、それに応じて質問に答えると良いでしょう! – BigDataScientist

+0

はい、申し訳ありません。どうもありがとう !! – raju

1

を、あなたは

# get 3 column data.frame 
dat2 <- cbind(Symbol=dat$Symbol, stack(dat[-1])) 
# drop unacceptable values 
dat2[abs(dat2$values) > 1,] 
    Symbol values ind 
3 CCNL  2 S1 
7 CCNL  -2 S2 
8 AGRN  2 S2 
10 BHGV  -2 S3 
12 AGRN  -2 S3 
13 ATAC  -2 S4 
14 BHGV  2 S4 
17 ATAC  2 S5 
+0

'> 1'はデータのこのサブセットではもちろん動作しますが、絶対値> 2の場合には少し危険です。 – BigDataScientist

+0

これはもちろん可能性があります。 'abs(diff(dat2 $ values - 2)<0.5)'などのような簡単な回避策があります。 – lmo

関連する問題