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)