2017-05-15 19 views
0

私は以下のようにRにdfDataというデータフレームを持っています。条件付き更新値

x y 
10 A 
20 B 
30 C 
40 D 

私は以下を達成しようとしています。 Xの値が10の場合

は、「XYZ」

機能またはRでこれを行うには、エレガントな方法はありに値を更新しますか?複数のifelseステートメントを回避しようとしています。

おかげ

+0

ただ1つの交換が必要ですか?または、変更したい値がさらにたくさんありますか? –

+0

あなたの説明によると、複数のifelseは必要ありません。一つだけ。さもなければ、あなたは 'replace'を使うことができます – Sotos

+0

優雅さのために、data.tableを使うときに' DT [x == 10、y:= "XYZ"] 'があります。代わりに、ええ、 'replace'は悪くない:' transform(DF、y = replace(y、x == 10、 "XYZ")) 'または何か。条件付きで割り当てたい値がさらにある場合は、data.tableの「更新結合」があります。http://franknarf1.github.io/r-tutorial/_book/tables.html#joins-updateする必要がありますしかし、より完全な例を投稿してください。 – Frank

答えて

0

あなたはxの値に応じて、多くのyの値を交換する必要がある場合は、1つのかのうアプローチは次のとおりです。

# define df as data.table 
library(data.table) 
df <- data.table(x=c(10,20,30,40,50,60,70,80,90), y= c('A', 'B', 'C', 'D','A', 'B', 'C', 'D', 'A')) 

> df 
    x y 
1: 10 A 
2: 20 B 
3: 30 C 
4: 40 D 
5: 50 A 
6: 60 B 
7: 70 C 
8: 80 D 
9: 90 A 

# define your pair of values for replacement 
a <- c(10,20,50) 
b <- c('XYZ', 'ZYX', 'AAA') 

# x = 10 will cause y to be replaced by 'XYZ', x= 20 will cause y to be replaced by 'ZYX' and so on ... 

# replacement 

for (i in 1:length(a)) { 
    df[ x==a[i], y := b[i]] 
} 

> df 
    x y 
1: 10 XYZ 
2: 20 ZYX 
3: 30 C 
4: 40 D 
5: 50 AAA 
6: 60 B 
7: 70 C 
8: 80 D 
9: 90 A 

ベクトルa、bは任意の長さを持っていますが、値xとペアにする必要がある可能性がありと値y。

0
x <- c(10,20,30,40) 

y <- c("a", "b", "c", "d") 

df1 <- data.frame(x,y) 


df1$y <- as.character(df1$y) 

Now we get the data frame as you want: 

> df1 
    x y 
1 10 a 
2 20 b 
3 30 c 
4 40 d 

> df1[which(df1$x==10),2] <- 'xyz' 

This produces: 

> df1 
    x y 
1 10 xyz 
2 20 b 
3 30 c 
4 40 d 
+0

私の場合は同じ値を更新したいのですが、私は基本的に10をxyzにします。 – femi