2016-07-01 7 views
2

Ich bin auf der Suche nach einer Spalte zu einer data.table, die eine Verkettung von mehreren anderen Spalten ist, deren Namen ich in einem Vektor cols gespeichert habe. Per https://stackoverflow.com/a/21682545/1840471 versuchte ich do.call + paste aber konnte es nicht funktionieren. Hier ist, was ich versucht habe:Verknüpfen eines Vektors von Spaltennamen in R data.table

# Using mtcars as example, e.g. first record should be "110 21 6" 
dt <- data.table(mtcars) 
cols <- c("hp", "mpg", "cyl") 
# Works old-fashioned way 
dt[, slice.verify := paste(hp, mpg, cyl)] 
# Raw do.call+paste fails with message: 
# Error in do.call(paste, cols): second argument must be a list 
dt[, slice := do.call(paste, cols)] 
# Making cols a list makes the column "hpmpgcyl" for each row 
dt[, slice := do.call(paste, as.list(cols))] 
# Applying get fails with message: 
# Error in (function (x) : unused arguments ("mpg", "cyl") 
dt[, slice := do.call(function(x) paste(get(x)), as.list(cols))] 

Hilfe geschätzt - danke.

ähnliche Fragen:

Antwort

5

Wir mget verwenden können, um die Werte der Elemente in 'cols' als list

dt[, slice := do.call(paste, mget(cols))] 
head(dt, 2) 
# mpg cyl disp hp drat wt qsec vs am gear carb slice 
#1: 21 6 160 110 3.9 2.620 16.46 0 1 4 4 110 21 6 
#2: 21 6 160 110 3.9 2.875 17.02 0 1 4 4 110 21 6 

Oder eine andere Option zurückzukehren ist die "angeben cols' in .SDcols und paste die .SD

dt[, slice:= do.call(paste, .SD), .SDcols = cols] 
head(dt, 2) 
# mpg cyl disp hp drat wt qsec vs am gear carb slice 
#1: 21 6 160 110 3.9 2.620 16.46 0 1 4 4 110 21 6 
#2: 21 6 160 110 3.9 2.875 17.02 0 1 4 4 110 21 6 
+0

Danke, ich habe 'mget' vorher noch nicht gesehen und sehe es nicht in den Referenzen. Wie funktioniert das anders als "bekommen"? –

+1

@MaxGhenis @MaxGhenis Es ist ähnlich zu verwenden "Get" in einer Schleife (für Vektoren, die Länge> 1) haben 'dt [, Scheibe: = do.call (einfügen, lapply (cols, Funktion (x) get (x))]]] ' – akrun

+2

' .SDcols' ist der idiomatische Weg - nur um es klar zu machen. 'mget' /' get' konnte in verschiedenen Situationen langsam werden. –