提问人:holala 提问时间:4/29/2023 最后编辑:holala 更新时间:4/29/2023 访问量:49
如何将数值列分解为用户定义的区间
How to factorize a numeric column into user-defined intervals
问:
我有兴趣将数值列分解为 3 个因子。我所做的是将列子集为 3 个区间范围,然后尝试将 3 个区间分解为单个列 Z,最后,将新的因子列 Z 合并到我的原始数据框中,但我的想法不起作用。有没有一种简单的方法可以将数值列分解为任意数量的因子,这样数据框就不会失真?
set.seed(0)
df1 <- data.frame(Y =floor(runif(10, min=0, max=10)),
X =floor(runif(10, min=0, max=50)))
str(df1)
'data.frame': 10 obs. of 2 variables:
$ Y: num 8 2 3 5 9 2 8 9 6 6
$ X: num 3 10 8 34 19 38 24 35 49 19
# The intended three factor intervals: X=3, 4<=X<=30, X>30
df1$fac1 <- factor(df1$X == 3, label=c(0,1))
df1$fac2 <- factor(df1$X >= 4 & df1$X <= 30, label=c(0,1))
df1$fac3 <- factor(df1$X > 30, label=c(0,1))
head(df1)
str(df1)
df2 = cbind(df1$Y, df1$X1, df1$X2, df1$X3)
Warning messages:
1: In xtfrm.data.frame(x) : cannot xtfrm data frames
2: In xtfrm.data.frame(x) : cannot xtfrm data frames
3: In xtfrm.data.frame(x) : cannot xtfrm data frames
head(df2,3)
[,1] [,2] [,3] [,4]
[1,] 8 2 2 2
[2,] 2 1 1 1
[3,] 3 2 2 2
但是,即使这有效,我怀疑这可能会扭曲我原来的行。我真正想要的是使用给定的间隔使 X 成为具有 3 个级别的单列因子。df1
答:
0赞
YH Jang
4/29/2023
#1
您可以使用 .factor()
df1$fac1 <- factor(df1$X == 3, label=c(0,1))
df1$fac2 <- factor(df1$X >= 4 & df1$X <= 30, label=c(0,1))
df1$fac3 <- factor(df1$X > 30, label=c(0,1))
输出
Y X fac1 fac2 fac3
1 8 3 1 0 0
2 2 10 0 1 0
3 3 8 0 1 0
4 5 34 0 0 1
5 9 19 0 1 0
6 2 38 0 0 1
7 8 24 0 1 0
8 9 35 0 0 1
9 6 49 0 0 1
10 6 19 0 1 0
评论
0赞
holala
4/29/2023
我认为我真正想要的是使用给定的间隔使 X 成为具有 3 个级别的单列因子。
1赞
L Tyrone
4/29/2023
#2
有很多选择,但在这种情况下可能是最好的:cut()
# Your data
set.seed(0)
df1 <- data.frame(Y = floor(runif(10, min=0, max=10)),
X = floor(runif(10, min=0, max=50)))
df1$Z <- cut(df1$X, c(0, 3, 30, Inf), labels = c(1:3), ordered_result = TRUE)
df1
# Y X Z
# 1 8 3 1
# 2 2 10 2
# 3 3 8 2
# 4 5 34 3
# 5 9 19 2
# 6 2 38 3
# 7 8 24 2
# 8 9 35 3
# 9 6 49 3
# 10 6 19 2
str(df1)
# 'data.frame': 10 obs. of 3 variables:
# $ Y: num 8 2 3 5 9 2 8 9 6 6
# $ X: num 3 10 8 34 19 38 24 35 49 19
# $ Z: Ord.factor w/ 3 levels "1"<"2"<"3": 1 2 2 3 2 3 2 3 3 2
评论
1赞
holala
4/29/2023
df1$X <- cut(df1$X, c(0, 3, 30, Inf), labels = c(1:3), ordered_result = TRUE)
给出了一个有序的因子,这正是我想要的。
0赞
L Tyrone
4/29/2023
@holala 很高兴我能帮上忙。更新了我的答案以反映您的评论。如果这个答案有帮助,请考虑投票并选择这个作为你接受的答案。谢谢。
评论
?cut()