我得到一个数据框,其中包含一个名为PE的列,值为1到6:
> head(data)
NID PE
1 4
2 5
3 3
4 4
5 1
6 6
7 2
8 3
9 3
并且需要使用其值
创建一个新的因子列> data$TYPE = factor(data$PE)
> head(data)
NID PE TYPE
1 4 4
2 5 5
3 3 3
4 4 4
5 1 1
6 6 6
7 2 2
8 3 3
9 3 3
> levels(data$TYPE)
[1] "1" "2" "3" "4" "5" "6"
但问题是关卡的数量。 TYPE col必须根据数据$ PE值仅在3个级别进行重新编码。 1,2 =等级“1”; 3,4 =等级“2”和5,6 =等级“3”,并获得如下内容:
> head(data)
NID PE TYPE
1 4 2
2 5 3
3 3 2
4 4 2
5 1 1
6 6 3
7 2 1
8 3 2
9 3 2
> levels(data$TYPE)
[1] "1" "2" "3"
解决方案可能非常简单,但我觉得我卡住了,只能创建无用的垃圾代码,所以非常感谢所有帮助。
答案 0 :(得分:3)
最简单的方法是使用TYPE
创建cut
,用于存储数字变量,而不是factor
:
df <- data.frame(NID = 1:9,
PE = c(4L, 5L, 3L, 4L, 1L, 6L, 2L, 3L, 3L))
df$TYPE <- cut(df$PE, 3, labels = 1:3)
df
#> NID PE TYPE
#> 1 1 4 2
#> 2 2 5 3
#> 3 3 3 2
#> 4 4 4 2
#> 5 5 1 1
#> 6 6 6 3
#> 7 7 2 1
#> 8 8 3 2
#> 9 9 3 2
str(df)
#> 'data.frame': 9 obs. of 3 variables:
#> $ NID : int 1 2 3 4 5 6 7 8 9
#> $ PE : int 4 5 3 4 1 6 2 3 3
#> $ TYPE: Factor w/ 3 levels "1","2","3": 2 3 2 2 1 3 1 2 2
您可能需要将breaks
参数设置为明确的中断向量而不是多个二进制位,以使其按照您喜欢的方式进行离散化。
旁注:使用数字作为因素的标签是一个非常糟糕的主意。因子在内部用整数表示,如果标签是不同的数字,你最终可能会得到一个看起来像一组数字但是表现得像,有时变成另一个数字的向量,导致很多混乱。
答案 1 :(得分:2)
Coupe的可能性,都使用dplyr
包:
data <- data.frame(NID = 1:9,
PE = c(4, 5, 3, 4, 1, 6, 2, 3, 3))
对于你的例子:
data <- data %>%
mutate(type = as.factor(ceiling(PE/2)))
更一般地说:
data <- data %>%
mutate(type = as.factor(case_when(
PE %in% c(1, 2) ~ 1,
PE %in% c(3, 4) ~ 2,
PE %in% c(5, 6) ~ 3
)))
那就是说,一般来说我不喜欢因子变量,我通常更喜欢分类变量的字符变量。