簡體   English   中英

逐行排序然后跨數據框的特定列連接

[英]Row-wise sort then concatenate across specific columns of data frame

(不包含排序的相關問題。不需要排序的時候直接用paste就很簡單了。)

我有一個不太理想的結構表,其中包含通用“item1”、“item2”等字符列。我想創建一個新的字符變量,它是這些列的字母順序、逗號分隔連接。 例如,在第 5 行中,如果 item1 = "milk"、item2 = "eggs" 和 item3 = "butter",則第 5 行中的新變量可能是“butter、egs、milk”

我在下面寫了一個函數f()來處理兩個字符變量。 但是,我遇到了麻煩

  • 使用mapply或其他“矢量化”(我知道這實際上只是一個 for 循環)
  • 將函數泛化到任意數量的列

非常感謝任何幫助。

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

只需應用向下行:

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

如果需要,請將其包裝在一個函數中。 您必須定義要發送的列或假設所有列。 即應用(df[,2:3],1,f()...

sort(x) 與 x[order(x)] 相同

我的第一個想法是這樣做:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM