2013-08-27 4 views
23

Bir dizi sütuna sahip bir veri çerçevem ​​var ve her bir satırdaki her satırın uzunluğu için ayrı bir sütun oluşturmak istiyorum.Sütunlar arasında geçiş yapın ve dize uzunluklarını yeni sütunlar olarak ekleyin

Sütun adlarını yinelemeye çalışıyorum ve her sütun için '_length' ekli bir sütun çıktı.

Örneğin col1 | col2 col1'e giderdi | col2 | col1_length | col2_length

kullanıyorum kodudur:

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

Ancak bu atar ve hata: Karmaşık atama geçersiz fonksiyonu. Bu şekilde döngüler kullanabilir miyim?

cevap

60

$'un programsal eşdeğeri [['u kullanmanız gerekir. Aksi takdirde, örneğin, icol1 olduğunda, R df$col1 yerine df$i'u arar.

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

Bu, aşağıdaki işlevlerden herhangi biri kullanılarak yapılabilir: Ben gibi bir şey düşünüyorum: junk <- sapply (names (df), function (x) df [[x]] <- str_length (df [[i]])) 'beklendiği gibi çalışmıyor. –

8

Orijinal data.frame için cbind sonra, str_length onu her sütunu geçmesine lapply kullanabilirsiniz ...

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
dplyr ile

ve stringr sen mutate_all kullanabilirsiniz:

> 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

Bütünlük uğruna, bir data.table çözümü de var:

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