J'ai une colonne de mon dataframe qui contient quelques caractères et un vecteur de facteurs. Je voudrais que chaque groupe de valeur attribue un facteur afin que le premier groupe de caractères obtienne le premier facteur, le deuxième groupe le deuxième facteur, etc.

Col de la dataframe + vecteur de facteurs:

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

Résultats attendus:

          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

Des données :

Vecteur de facteurs:

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

Col de caractères:

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")
3
Omlere 21 avril 2017 à 14:06

3 réponses

Meilleure réponse

Vous pouvez utiliser rleid de data.table:

library(data.table)
df$factor<-vec_factor[rleid(df$test_vector)]

Résultat

 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
Erdem Akkas 21 avril 2017 à 11:26

Nous pouvons faire

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"

Ou utilisez 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

REMARQUE: les deux méthodes sont dans base R

1
akrun 21 avril 2017 à 12:34

Vous pouvez le faire dans la base 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

Vous créez donc d'abord une colonne de type factor puis remplacez les niveaux par les niveaux de vec_factor.


OU (merci à @alexis_laz pour l'avoir signalé)

df$factor <- factor(df$test_vector, labels = levels(vec_factor))
2
989 21 avril 2017 à 12:22