为每组字符分配自定义因子值

4
我有一个数据框中的一列包含一些字符和一个因子向量。我想为每个值组分配一个因子,以便第一组字符获得第一个因子,第二组获得第二个因子等。
数据框的列 + 因子向量:
df$charac:
          charac
1            0
2            0
3            0
4            1
5            1
6            2
7            2
8            2
9            3
10           4
11           4
12           4

vec_factor :

[1] 39 42 76 89 68
Levels: 39 42 68 76 89

预期结果:

          charac  factor
1            0      39
2            0      39
3            0      39
4            1      42
5            1      42
6            2      76
7            2      76
8            2      76
9            3      89
10           4      68
11           4      68
12           4      68

数据:

因素向量:

structure(c(1L, 2L, 4L, 5L, 3L), .Label = c("39", "42", "68", 
"76", "89"), class = "factor")

字符列:

structure(list(test_vector = c("0", "0", "0", "1", "1", "2", 
"2", "2", "3", "4", "4", "4")), .Names = "test_vector", row.names = c(NA, 
-12L), class = "data.frame")

1
如果你的因子向量是 fac,数据框是 char,你可以尝试使用 char$fac <- fac[as.numeric(as.factor(char$test_vector))] - ikop
@ikop 谢谢!很好用,但是在这种情况下 as.numeric() 不是必要的。 - Omlere
你说得对,谢谢。 - ikop
3个回答

2
您可以在基本R中完成此操作:
df$factor<- as.factor(df$test_vector)
levels(df$factor) <- levels(vec_factor)

   # test_vector factor
# 1            0     39
# 2            0     39
# 3            0     39
# 4            1     42
# 5            1     42
# 6            2     68
# 7            2     68
# 8            2     68
# 9            3     76
# 10           4     89
# 11           4     89
# 12           4     89

首先创建一个类型为因子(factor)的列,然后用vec_factor的水平替换它的水平(levels)。


或者(感谢@alexis_laz指出)

df$factor <- factor(df$test_vector, labels = levels(vec_factor))

是的,这也可以工作,但需要更长的时间才能得到预期的结果,即一个有两列的数据框。 - Omlere
1
完美运行 - Omlere
1
另一种选择是使用 factor 函数的 "labels" 参数 -- factor(df$test_vector, labels = levels(vec_factor)) - alexis_laz

1
您可以使用来自 `data.table` 的 `rleid`:
library(data.table)
df$factor<-vec_factor[rleid(df$test_vector)]

Result

 df
 test_vector factor
1            0     39
2            0     39
3            0     39
4            1     42
5            1     42
6            2     76
7            2     76
8            2     76
9            3     89
10           4     68
11           4     68
12           4     68

1
我们可以做。
df1$factor <- as.character(vec_factor)[as.integer(df1[[1]])+1]
df1$factor
#[1] "39" "39" "39" "42" "42" "76" "76" "76" "89" "68" "68" "68"

或者使用match
df1$factor <- with(df1, vec_factor[match(test_vector, unique(test_vector))])
df1$factor
#[1] 39 39 39 42 42 76 76 76 89 68 68 68
#Levels: 39 42 68 76 89

注意:这两种方法都是使用基本的R编程语言实现的。其中包含HTML代码,不做解释。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接