2015-02-25 2 views
5

(Связанные question, что не включает в себя сортировку. Легко использовать только paste, когда вам не нужно сортировать.)строчная сортировка затем сцепить по определенным столбцам кадра данных

У меня есть менее чем -идеально-структурированная таблица с символьными столбцами, которые являются общими «item1», «item2» и т. д. Я хотел бы создать новую символьную переменную, которая представляет собой разделенную запятыми конкатенацию этих столбцов. Так, например, в строке 5, если item1 = «молоко», item2 = «яйца», а item3 = «масло», новая переменная в строке 5 может быть «масло, яйца, молоко»

Я написал функция f() ниже, которая работает с двумя переменными символов. Тем не менее, у меня возникли проблемы

  • Использование mapply или другой «векторизации» (я знаю, что это на самом деле просто цикл)
  • Обобщая функцию произвольного числа столбцов

Любая помощь очень оценили.

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 

ответ

3

Моя первая мысль была бы сделать это:

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

Но вы могли бы сделать вашу работу функции с несколькими простых модификациями:

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

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

Просто применять вниз строки :

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

Wrap он в функции, если вы хотите. Вам нужно будет определить, какие столбцы отправлять или принимать все. (df ​​[, 2: 3], 1, f() ...

вид (x) такой же, как x [порядок (x)]

Смежные вопросы