根据截止值创建列

这应该很简单,但我无法弄清楚最简单的方法。我想将列减少到更简单的范围。看看下面的数据集:根据截止值创建列

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

回到顶部