根据截止值创建列

时间:2017-12-03 00:44:09

标签: r dataframe

这应该很简单,但我无法找出最简单的方法。我想将列减少到更简单的范围。采用以下数据集:

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

我想创建一个新的列white $ rank和black $ rank,其中数字范围2000-2100得到值1,2002-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 $ white,2,2)

但是我想要一个更灵活的解决方案,我可以让white_rank获得任何价值。基本思想是生成一个用于划分截止值seq(2000,2900, 100)的序列,然后根据行是否满足这些截止值来分配唯一值。

2 个答案:

答案 0 :(得分: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 :(得分:1)

使用dplyr和基础R的cut函数的解决方案。想法是使用cut创建因子,然后使用levels<-分配新的级别名称。我使用mutate_all中的dplyr为所有列执行此操作。

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

数据

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)