我的数据框中有一列包含一些字符和一系列因子。我想为每组值分配一个因子,以便第一组字符获得第一个因子,第二组获得第二个因子等。
数据帧的Col +因子向量:
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")
答案 0 :(得分: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
因此,您首先创建一个类型因子列,然后将其级别替换为vec_factor
级别。
或者(感谢@alexis_laz指出这一点)
df$factor <- factor(df$test_vector, labels = levels(vec_factor))
答案 1 :(得分:1)
您可以使用rleid
中的data.table
:
library(data.table)
df$factor<-vec_factor[rleid(df$test_vector)]
<强>结果强>
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
答案 2 :(得分: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
注意:这两种方法都在base R