2015-02-25 12 views
5

(liên quan question mà không bao gồm sắp xếp. Thật dễ dàng để chỉ cần sử dụng paste khi bạn không cần phải sắp xếp.)Row-khôn ngoan loại sau đó tiếp nhau trên các cột cụ thể của khung dữ liệu

Tôi có một ít hơn bảng có cấu trúc thực sự với các cột ký tự chung chung là "item1", "item2" v.v. Tôi muốn tạo một biến ký tự mới, là phần tử được phân tách bằng dấu phẩy, được phân tách bằng dấu phẩy của các cột này. Ví dụ: trong hàng 5, nếu item1 = "sữa", item2 = "trứng" và item3 = "bơ", biến mới trong hàng 5 có thể là "bơ, trứng, sữa"

Tôi đã viết hàm f() bên dưới hoạt động trên hai biến ký tự. Tuy nhiên, tôi đang gặp khó khăn

  • Sử dụng mapply hoặc "vector" khác (Tôi biết nó thực sự chỉ là một vòng lặp for)
  • Khái quát các chức năng để một số bất kỳ của cột

Bất kỳ sự giúp đỡ nhiều đánh giá cao.

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 

Trả lời

3

Suy nghĩ đầu tiên của tôi sẽ đã làm điều này:

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

Nhưng bạn có thể làm cho công việc chức năng của bạn với một vài thay đổi đơn giản:

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

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

Chỉ cần áp dụng xuống hàng :

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

Wrap nó trong một hàm nếu bạn muốn. Bạn sẽ phải xác định cột nào để gửi hoặc giả sử tất cả. tức là áp dụng (df [, 2: 3], 1, f() ...

sắp xếp (x) giống như x [order (x)]

Các vấn đề liên quan