2017-12-03 99 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