2017-12-03 109 views
1

這應該很簡單,但我無法弄清楚最簡單的方法。我想將列減少到更簡單的範圍。看看下面的數據集:根據截止值創建列

white black 
2000  2100 
2050  2000 
2100  2200 
2150  2300 
2240  2240 
2300  2550 
2400  2450 
2500  2150 
2850  2000 

我想創建一個新的列白色$秩和黑色$排名在數值範圍2000-2100得到的值爲1,2100-2200得到的值爲2,依此上。

white_rank black_rank 
    0  1 
    0  0 
    1  2 
    1  3 
    2  2 
    3  5 
    4  4 
    5  1 
    8  0 

,我感到我可以通過像 實現這一white_class < - SUBSTR(DF $白色,2,2)

但我希望有一個更靈活的解決方案,我可以讓white_rank採取任何價值。基本想法是生成一個序列,用於劃分截止點seq(2000,2900, 100),然後根據行是否滿足這些截點來分配唯一值。

+0

請搜索切換功能 – MichaelChirico

+1

是的,是這樣的: 'DF $秩< - 切(變量,符= C(SEQ(2000,3000,100 )),標籤= 0:9) df [is.na(df)] < - 0' – PereG

+0

完美。謝謝。 – Parseltongue

回答

2

可以使用cut()函數創建如下範圍。

rawData <- "white black 
2000  2100 
2050  2000 
2100  2200 
2150  2300 
2240  2240 
2300  2550 
2400  2450 
2500  2150 
2850  2000" 

theData <- read.table(textConnection(rawData),header=TRUE) 
# count the bins 
levelsWhite <- round((max(theData$white) - min(theData$white))/100,0)+1 
levelsBlack <- round((max(theData$black) - min(theData$black))/100,0)+1 
theData$whiteFactor <- cut(theData$white,levelsWhite,labels=FALSE,right=FALSE) 
theData$blackFactor <- cut(theData$black,levelsBlack,labels=FALSE,right=FALSE) 
theData 

輸出如下所示。

> theData 
    white black whiteFactor blackFactor 
1 2000 2100   1   2 
2 2050 2000   1   1 
3 2100 2200   2   3 
4 2150 2300   2   4 
5 2240 2240   3   3 
6 2300 2550   4   6 
7 2400 2450   5   5 
8 2500 2150   6   2 
9 2850 2000   9   1 
1

使用dplyr的溶液,並從基R的cut功能的想法是使用cut創建因子,然後使用levels<-分配新級別名稱。我使用dplyr中的mutate_all對所有列執行此操作。

library(dplyr) 

dt2 <- dt %>% 
    mutate_all(funs(cut(., breaks = seq(2000, 2900, by = 100), right = FALSE, dig.lab = 1))) %>% 
    mutate_all(funs(`levels<-`(., value = 0:8))) 
# dt2 
# white black 
# 1  0  1 
# 2  0  0 
# 3  1  2 
# 4  1  3 
# 5  2  2 
# 6  3  5 
# 7  4  4 
# 8  5  1 
# 9  8  0 

DATA

dt <- read.table(text = "white black 
2000  2100 
2050  2000 
2100  2200 
2150  2300 
2240  2240 
2300  2550 
2400  2450 
2500  2150 
2850  2000", 
       header = TRUE) 
+1

這非常聰明。謝謝一堆 – Parseltongue