我有一个包含几列的数据框,其中一列是rank,一个介于1和20之间的整数。我想创建另一个包含bin值的列,如“1-4”,“5-10”, “11-15”,“16-20”。
最有效的方法是什么?
我看起来像这样的数据框(.csv格式):
rank,name,info
1,steve,red
3,joe,blue
6,john,green
3,liz,yellow
15,jon,pink
我想在数据框中添加另一列,所以它会是这样的:
rank,name,info,binValue
1,steve,red,"1-4"
3,joe,blue,"1-4"
6,john,green, "5-10"
3,liz,yellow,"1-4"
15,jon,pink,"11-15"
我现在这样做的方式不起作用,因为我想保持data.frame完好无损,如果df $的值在给定范围内,则只添加另一列。谢谢。
答案 0 :(得分:43)
请参阅?cut
并指定breaks
(也许labels
)。
x$bins <- cut(x$rank, breaks=c(0,4,10,15), labels=c("1-4","5-10","10-15"))
x
# rank name info bins
# 1 1 steve red 1-4
# 2 3 joe blue 1-4
# 3 6 john green 5-10
# 4 3 liz yellow 1-4
# 5 15 jon pink 10-15
答案 1 :(得分:6)
dat <- "rank,name,info
1,steve,red
3,joe,blue
6,john,green
3,liz,yellow
15,jon,pink"
x <- read.table(textConnection(dat), header=TRUE, sep=",", stringsAsFactors=FALSE)
x$bins <- cut(x$rank, breaks=seq(0, 20, 5), labels=c("1-5", "6-10", "11-15", "16-20"))
x
rank name info bins
1 1 steve red 1-5
2 3 joe blue 1-5
3 6 john green 6-10
4 3 liz yellow 1-5
5 15 jon pink 11-15
答案 2 :(得分:2)
我们可以使用smart_cut
软件包中的cutr
:
# devtools::install_github("moodymudskipper/cutr")
library(cutr)
使用@Andrie的示例数据:
x$bins <- smart_cut(x$rank,
c(1,5,11,16),
labels = ~paste0(.y[1],'-',.y[2]-1),
simplify = FALSE)
# rank name info bins
# 1 1 steve red 1-4
# 2 3 joe blue 1-4
# 3 6 john green 5-10
# 4 3 liz yellow 1-4
# 5 15 jon pink 11-15