J'ai un cadre de données avec un certain nombre de colonnes et je voudrais sortir une colonne distincte pour chacune avec la longueur de chaque ligne qu'il contient.
J'essaie de parcourir les noms de colonne et, pour chaque colonne, une colonne correspondante avec '_length' attachée.
Par exemple col1 | col2 irait à col1 | col2 | col1_length | col2_length
Le code que j'utilise est:
df <- data.frame(col1 = c("abc","abcd","a","abcdefg"),col2 = c("adf qqwe","d","e","f"))
for(i in names(df)){
df$paste(i,'length',sep="_") <- str_length(df$i)
}
Cependant cela jette et erreur:
fonction non valide dans une affectation complexe.
Puis-je utiliser des boucles de cette manière en R?
Vous devez utiliser [[
, l’équivalent programmatique de $
. Sinon, par exemple, lorsque i
est col1
, R cherchera df$i
au lieu de df$col1
.
for(i in names(df)){
df[[paste(i, 'length', sep="_")]] <- str_length(df[[i]])
}
Vous pouvez utiliser lapply
pour transmettre chaque colonne à str_length
, Puis cbind
à votre data.frame
D'origine ...
library(stringr)
out <- lapply( df , str_length )
df <- cbind( df , out )
# col1 col2 col1 col2
#1 abc adf qqwe 3 8
#2 abcd d 4 1
#3 a e 1 1
#4 abcdefg f 7 1
Avec dplyr
et stringr
, vous pouvez utiliser mutate_all
:
> df %>% mutate_all(funs(length = str_length(.)))
col1 col2 col1_length col2_length
1 abc adf qqwe 3 8
2 abcd d 4 1
3 a e 1 1
4 abcdefg f 7 1
Par souci d'exhaustivité, il y a aussi un data.table
Solution:
library(data.table)
result <- setDT(df)[, paste0(names(df), "_length") := lapply(.SD, stringr::str_length)]
result
# col1 col2 col1_length col2_length
#1: abc adf qqwe 3 8
#2: abcd d 4 1
#3: a e 1 1
#4: abcdefg f 7 1