根据截止值创建列
这应该很简单,但我无法弄清楚最简单的方法。我想将列减少到更简单的范围。看看下面的数据集:根据截止值创建列
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)
,然后根据行是否满足这些截点来分配唯一值。
回答:
可以使用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
回答:
使用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)
以上是 根据截止值创建列 的全部内容, 来源链接: utcz.com/qa/259017.html