如何更改R

时间:2018-05-15 21:32:24

标签: r

我得到一个数据框,其中包含一个名为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"

解决方案可能非常简单,但我觉得我卡住了,只能创建无用的垃圾代码,所以非常感谢所有帮助。

2 个答案:

答案 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
  )))

那就是说,一般来说我不喜欢因子变量,我通常更喜欢分类变量的字符变量。