R语言 如何将数值列分解为用户定义的间隔

yv5phkfx  于 2023-05-04  发布在  其他
关注(0)|答案(2)|浏览(102)

我感兴趣的是将一个数字列分解为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

但是,即使这样做有效,我怀疑这可能会扭曲我的原始df1的行。我真正想要的是使用给定的间隔使X成为具有3个水平的单列因子。

efzxgjgh

efzxgjgh1#

有很多选择,但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
2uluyalo

2uluyalo2#

可以使用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

相关问题