web-dev-qa-db-fra.com

Parcourez les colonnes et ajoutez des longueurs de chaîne en tant que nouvelles colonnes

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?

29
Zfunk

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]])
}
68
flodel

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
10
Simon O'Hanlon

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
6
m0nhawk

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
3
Uwe