2013-08-27 42 views
23

我有一個數據框,其中包含多個列,並且希望爲每個列輸出一個單獨的列,並且每個列都包含每行的長度。循環遍歷列並將字符串長度添加爲新列

我想遍歷列名,併爲每個列輸出一個相應的列'_length'附加。

例如col1 | col2會去col1 | col2 | col1_length | col2_length

我使用的代碼是:

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) 
} 

然而,這將引發和錯誤:在複雜的轉讓無效的功能。我能在R中以這種方式使用循環嗎?

回答

60

您需要使用[[,其編程等效爲$。否則,例如,當icol1時,R將查找df$i而不是df$col1

for(i in names(df)){ 
    df[[paste(i, 'length', sep="_")]] <- str_length(df[[i]]) 
} 
+0

這可以使用任何應用函數來完成嗎?我在想這樣的:'junk < - sapply(names(df),function(x)df [[x]] < - str_length(df [[i]]))'但它不能按預期工作。 –

8

您可以使用lapply到每一列它傳遞給str_length,然後cbind你原來的data.frame ...

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 
5

隨着dplyrstringr您可以使用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 
2

爲了完整起見,還有一個data.table解決方案:

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