我有一个包含多个列的数据框,并希望为每个列输出一个单独的列,其中包含每行的长度。
我正在尝试遍历列名,并为每个列输出一个附加了“_ 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?
中以这种方式使用循环吗?答案 0 :(得分:68)
您需要使用[[
,程序化等效于$
。否则,例如,当i
为col1
时,R会查找df$i
而不是df$col1
。
for(i in names(df)){
df[[paste(i, 'length', sep="_")]] <- str_length(df[[i]])
}
答案 1 :(得分:9)
您可以使用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
答案 2 :(得分:6)
使用dplyr
和stringr
,您可以使用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
答案 3 :(得分:3)
为了完整起见,还有一个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