这应该很简单,但我无法找出最简单的方法。我想将列减少到更简单的范围。采用以下数据集:
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)
的序列,然后根据行是否满足这些截止值来分配唯一值。
答案 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)