2015-03-27 6 views
5

Mam dane.frame, które jest prawie całkowicie puste, ale każdy wiersz ma jedną wartość. Jak mogę wykorzystać wektoryzowane lub inne r-wernakularne podejście, aby połączyć zawartość każdego wiersza w jeden wektor?Scalanie zawartości kolumn przy użyciu polecenia apply lub innego wektora opartego na metodzie

przykładowe dane:

raw_data <- structure(
    list(
     col1 = c("", "", "", "", ""), 
     col2 = c("", "", "", "", ""), 
     col3 = c("", "", "", "", ""), 
     col4 = c("", "", "", "Millburn - Union", ""), 
     col5 = c("", "", "Cranston (aka Garden City Center)", "",""), 
     col6 = c("", "", "", "", ""), 
     col7 = c("", "", "", "", ""), 
     col8 = c("", "", "", "", "Colorado Blvd"), 
     col9 = c("", "", "", "", ""), 
     col10 = c("", "", "", "", ""), 
     col11 = c("Palo Alto", "Castro (aka Market St)", "", "", "") 
    ), 
    .Names = c("col1", "col2", "col3", "col4", "col5", "col6", "col7", "col8", "col9", "col10", "col11"), 
    row.names = c(5L, 4L, 3L, 2L, 1L), 
    class = "data.frame" 
) 

To co próbowałem, ale to się nie powiedzie, gdyż zwraca 2-wymiarową macierz zamiast pożądanego Vector:

raw_data$test <- apply(raw_data, MAR=1, FUN=paste0) 

Odpowiedz

3

Twoja intuicja o apply ma rację . Wystarczy przekazać collapse argument paste:

apply(raw_data, 1, paste0, collapse = "") 
            5         4         3 
         "Palo Alto"   "Castro (aka Market St)" "Cranston (aka Garden City Center)" 
            2         1 
       "Millburn - Union"      "Colorado Blvd" 
5

Można to zrobić w bardzo prosty sposób za pomocą jednej operacji indeksu:

raw_data[raw_data!=''] 

Demo:

R> raw_data[raw_data!='']; 
[1] "Millburn - Union"     "Cranston (aka Garden City Center)" "Colorado Blvd"      "Palo Alto"       "Castro (aka Market St)" 

Jeśli dbasz o kolejność wektorów jest od góry do dołu (w przeciwieństwie do od lewej do prawej, a następnie od góry do dołu, co jest tym, co robi powyższa operacja), można transponować dane wejściowe.frame:

R> t(raw_data)[t(raw_data)!='']; 
[1] "Palo Alto"       "Castro (aka Market St)"   "Cranston (aka Garden City Center)" "Millburn - Union"     "Colorado Blvd" 
1

W tym przykładzie jest tylko jeden element w wierszu, który nie jest ''. Tutaj jest inny sposób na wykorzystanie paste z do.call

do.call(paste, c(raw_data, sep='')) 
#[1] "Palo Alto"       "Castro (aka Market St)"   
#[3] "Cranston (aka Garden City Center)" "Millburn - Union"     
#[5] "Colorado Blvd"  

Załóżmy, jeśli istnieje wiele elementów w rzędzie w „raw_data”, które nie są '', w tym przypadku, może być lepiej użyć sep=';' or, `.

raw_data[1,1] <- 'Millburn' 
raw_data[1,3] <- 'Something' 
gsub('^;+|;+$|(;);+', '\\1', do.call(paste, c(raw_data, sep=';'))) 
#[1] "Millburn;Something;Palo Alto"  "Castro (aka Market St)"  
#[3] "Cranston (aka Garden City Center)" "Millburn - Union"   
#[5] "Colorado Blvd"      

apply dostaje taki sam wynik jak powyżej

unname(apply(raw_data, 1, FUN=function(x) paste(x[x!=''],collapse=';'))) 
#[1] "Millburn;Something;Palo Alto"  "Castro (aka Market St)"  
#[3] "Cranston (aka Garden City Center)" "Millburn - Union"   
#[5] "Colorado Blvd"      
Powiązane problemy