5

if/else ループを使用して実行できる単純なデータ フレームの列変換がありますが、これを行うためのより良い方法があるかどうか疑問に思っていました。

初期データフレームは、

 df <-data.frame(cbind(x=rep(10:15,3), y=0:8))
 df
    x y
1  10 0
2  11 1
3  12 2
4  13 3
5  14 4
6  15 5
7  10 6
8  11 7
9  12 8
10 13 0
11 14 1
12 15 2
13 10 3
14 11 4
15 12 5
16 13 6
17 14 7
18 15 8

私がする必要があるのは、列「y」の値を次のように置き換えることです

'0' gets replaced with '2',
'1' gets replaced with '2.2',
'2' gets replaced with '2.4',
...
...
'6' gets replaced with '3.2'
'7' gets replaced with '3.3'
'8' gets replaced with '10'

最終的に次のような結果になるように、

> df
    x    y
1  10  2.0
2  11  2.2
3  12  2.4
4  13  2.6
5  14  2.8
6  15  3.0
7  10  3.2
8  11  3.3
9  12 10.0
10 13  2.0
11 14  2.2
12 15  2.4
13 10  2.6
14 11  2.8
15 12  3.0
16 13  3.2
17 14  3.3
18 15 10.0

いくつかの提案を検索して見つけましたが、それらを機能させることができませんでした。試みの1つは、次のようなものでした。

> levels(factor(df$y)) <- c(2,2.2,2.4,2.6,2.8,3,3.2,3.3,10)

Error in levels(factor(df$y)) <- c(2, 2.2, 2.4, 2.6, 2.8, 3, 3.2, 3.3,  : 
  could not find function "factor<-"

しかし、上記のエラーメッセージが表示されます。

誰でもこれで私を助けることができますか?

4

2 に答える 2

5

y+1置換のインデックスである事実を使用する

何かのようなもの

replacement <- c(2,2.2,2.4,2.6,2.8,3,3.2,3.3,10)
df <- within(df, z <- replacement[y+1])

または、data.tableシンタックス シュガーとメモリ効率のために使用する

library(data.table)
DT <- as.data.table(df)

DT[, z := replacement[y+1]]
于 2012-10-15T02:06:06.337 に答える
3

どうですか:

mylevels <- c(2,2.2,2.4,2.6,2.8,3,3.2,3.3,10)
df$z <- as.numeric(as.character(factor(df$y,labels=mylevels)))

これは、希望する結果にも一致します。

transform(df,z=ifelse(y==7,3.3,ifelse(y==8,10,2+y/5)))
于 2012-10-15T02:04:13.447 に答える