33

我有一个包含许多列的数据框,并且想为每个列输出一个单独的列,其中包含每行的长度。

我正在尝试遍历列名,并为每一列输出一个附加了“_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 中以这种方式使用循环吗?

4

4 回答 4

75

您需要使用[[, 的程序等效项$。否则,例如,当iis时col1,R 将寻找df$i而不是df$col1

for(i in names(df)){
  df[[paste(i, 'length', sep="_")]] <- str_length(df[[i]])
}
于 2013-08-27T10:19:53.763 回答
10

您可以使用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
于 2013-08-27T10:23:56.757 回答
7

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
于 2017-03-28T08:23:06.417 回答
4

为了完整起见,还有一个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
于 2017-03-28T12:42:38.123 回答