R 基于截断创建列

R 基于截断创建列,r,dataframe,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,2100-2200的值为

这应该很简单,但我想不出最简单的方法。我想把列减少到一个更简单的范围。以以下数据集为例:

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,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可以使用
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

使用
dplyr
和基数R的
cut
函数的解决方案。其思想是使用
cut
创建因子,然后使用
levels%

mutate_all(funs(`levels)请搜索剪切函数是的,类似这样:
df$rank perfect。谢谢。这非常聪明。谢谢大家
> 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
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)