2015-02-25 5 views
5

(Powiązane question który nie zawiera sortowania. Łatwo jest po prostu użyć paste kiedy nie trzeba posortować.)Wiersz mądry porządek następnie złączyć w poprzek poszczególnych kolumn ramki danych

Mam mniej niż -dostosowana strukturalnie tabela z kolumnami znaków, które są generyczne "element1", "element2" itd. Chciałbym utworzyć nową zmienną znakową, która jest alfabetyczną, oddzieloną przecinkiem konkatenacją tych kolumn. Na przykład w wierszu 5, jeśli item1 = "milk", item2 = "eggs", a item3 = "butter", nowa zmienna w wierszu 5 może być "masło, jaja, mleko"

Napisałem funkcja f() poniżej działa na dwóch zmiennych znakowych. Jednak mam problemy

  • Korzystanie mapply lub innego „wektoryzacji” (wiem, że to naprawdę tylko dla pętli)
  • Uogólniając funkcję do dowolnej liczby kolumn

Każda pomoc znacznie docenione.

df <- data.frame(a =c("foo","bar"), 
       b= c("baz","qux")) 
paste(df$a,df$b, sep=", ") 
# returns [1] "foo, baz" "bar, qux" ... but I want [1] "baz, foo" "bar, qux" 

f <- function(a,b) paste(c(a,b)[order(c(a,b))],collapse=", ") 
f("foo","baz") 
# returns [1] "baz, foo" ... which is what I want ... how to vectorize? 

df$new_var <- mapply(f, df$a, df$b) 
df 
#  a b new_var  <- new_var is not what I want 
# 1 foo baz 1, 2 
# 2 bar qux 1, 2 

# Interestingly, data.table is smart enough to fix my bad mapply 
library(data.table) 
dt <- data.table(a =c("foo","bar"), 
       b= c("baz","qux")) 
dt[,new_var:=mapply(f, a, b)] 
dt 
#  a b new_var <- new var IS what I want 
# 1: foo baz baz, foo 
# 2: bar qux bar, qux 

Odpowiedz

3

Moja pierwsza myśl byłby już to zrobić:

dt[, new_var := paste(sort(.SD), collapse = ", "), by = 1:nrow(dt)] 

Ale można zrobić swoją pracę funkcji z kilkoma prostymi modyfikacjami:

f = function(...) paste(c(...)[order(c(...))],collapse=", ") 

dt[, new_var := do.call(function(...) mapply(f, ...), .SD)] 
3

Wystarczy zastosować w dół wiersze :

apply(df,1,function(x){ 
    paste(sort(x),collapse = ",") 
}) 

Wrap to w funkcji, jeśli chcesz. Musisz albo określić, które kolumny wysłać, czy założyć wszystko. tj. zastosowanie (df [, 2: 3], 1, f() ...

sort (x) jest taki sam jak x [zamówienie (x)]

Powiązane problemy