2015-12-03 80 views
2

我有一個大數據框(x)與數字數據;前四行是這樣的:將數據框中的數值範圍轉換爲R中的字符/因子?

A B C D E F G H I J K L M N O P Q R S 
1 -10 0 0 0 20 10 30 0 60 15 -10 -10 10 60 -10 60 0 60 0 
2 0 0 0 0 0 0 0 0 60 15 -10 -10 10 60 -10 60 15 60 60 
3 0 0 0 0 0 0 0 0 60 15 -10 -10 10 60 -10 60 0 60 0 
4 10 20 30 40 0 10 0 0 60 15 -10 -10 10 60 -10 0 100 200 300 

我想替換字符以下一些規則的值: S:0-9 ,P:10-14 L:15-29 我:30- 59 R:> = 60

我想:

x[x < 10] <- "S" 
x[x > 9 & x < 15] <- "P" 
x[x > 14 & x < 30] <- "L" 
x[x > 29 & x < 60] <- "I" 
x[x > 60] <- "R" 

而且我得到這個:

A B C D E F G H I J K L M N O P Q R S 
1 R R R R R 10 R R 60 R R R R 60 R 60 R 60 R 
2 R R R R R R R R 60 R R R R 60 R 60 R 60 60 
3 R R R R R R R R 60 R R R R 60 R 60 R 60 R 
4 10 R R R R 10 R R 60 R R R R 60 R R 100 R R 

但當我:

x[x>60] <- 60 
x[x<10] <- 0 
x[x > 9 & x < 15] <- "P" 
x[x == 0] <- "S" 
x[x > 14 & x < 30] <- "L" 
x[x > 29 & x < 60] <- "I" 
x[x == 60] <- "R" 

我:

A B C D E F G H I J K L M N O P Q R S 
1 S S S S L P I S R L S S P R S R S R S 
2 S S S S S S S S R L S S P R S R L R R 
3 S S S S S S S S R L S S P R S R S R S 
4 P L I I S P S S R L S S P R S S R R R 

任何暗示對這個結果,並就如何正確地實現我的目標是什麼? 任何建議,歡迎

+0

看看'STR(DF)'之前和之後執行的每行代碼在你的第一次嘗試。我的猜測是它在第一次調用之後發生了變化,並且在隨後的調用中x不再是數字。 – mts

+0

這兩個你想要的輸出是什麼?你不能只是做'df [] < - cut(unlist(df),c(-Inf,10,14,29,59,Inf),c(「S」,「P」,「L」,「我「,」R「))'? –

回答

1

基本上這裏所發生的,一旦你打電話

x[x < 10] <- "S" 

x不再是整數,但某些列變得性格。然後你開始比較字符和整數這給了意想不到的結果:

> "I" > 60 
[1] TRUE 

有一個簡單的出路:創建一個新的數據幀y在你寫你的結果:

y = x 

y[x < 10] <- "S" 
y[x > 9 & x < 15] <- "P" 
y[x > 14 & x < 30] <- "L" 
y[x > 29 & x < 60] <- "I" 
y[x >= 60] <- "R" 

輸出:

> y 
    A B C D E F G H I J K L M N O P Q R S 
1 S S S S L P I S R L S S P R S R S R S 
2 S S S S S S S S R L S S P R S R L R R 
3 S S S S S S S S R L S S P R S R S R S 
4 P L I I S P S S R L S S P R S S R R R 

請注意,我將您的>中的一個更改爲>=以包含所有情況。

附錄:數據

xx = " A B C D E F G H I J K L M N O P Q R S 
1 -10 0 0 0 20 10 30 0 60 15 -10 -10 10 60 -10 60 0 60 0 
2 0 0 0 0 0 0 0 0 60 15 -10 -10 10 60 -10 60 15 60 60 
3 0 0 0 0 0 0 0 0 60 15 -10 -10 10 60 -10 60 0 60 0 
4 10 20 30 40 0 10 0 0 60 15 -10 -10 10 60 -10 0 100 200 300" 
x = read.table(text = xx, header = T) 
+2

R中有一個內置函數,用於稱爲'cut'的操作。你可以做'df [] < - cut(unlist(df),c(-Inf,9,14,29,59,Inf),c(「S」,「P」,「L」,「I」 ,「R」))' –

+0

@DavidArenburg謝謝指出。這種解決方案在間隔不相鄰的情況下更加靈活,但是在這種情況下,我更喜歡更好地標記重複的'ifelse'解決方案。 – mts

相關問題