2015-04-28 7 views
6

Ich versuche, Argumente zu einem data.table Subset zu verwenden (und ein Mittel auf diese Untergruppe anzuwenden). Grundsätzlich werde ich der Funktion zwei Schlüssel und mehrere Elemente des dritten Schlüssels übergeben; das scheint verwirrend zu sein R, aber die Operation funktioniert genau wie erwartet, wenn sie außerhalb einer Funktionsumgebung ausgeführt wird.Verwirrendes Problem auf Multi-Key-Subsetting data.table innerhalb der Funktion

Hier ist ein Beispiel, das im Grunde bekommt, was ich versuche zu tun; es gibt eine Lösung, die nicht korrekt ist, während mein eigener Code einen Fehler (Text eingefügt unten) erzeugt:

set.seed(12345) 
dt<-data.table(yr=rep(2000:2005,each=20), 
       id=paste0(rep(rep(1:10,each=2),6)), 
       deg=paste0(rep(1:2,60)), 
       var=rnorm(120), 
       key=c("yr","id","deg")) 

fcn <- function(yr,ids,deg){ 
    dt[.(yr,ids,deg),mean(var)] 
} 

fcn(2004,paste0(1:3),"1") 

Diese Antwort ist zu geben, aber es ist völlig falsch (mehr dazu in einer Sekunde). Wenn ich dies von Hand tun, dann ist es kein Problem:

> fcn(2004,paste0(1:3),"1") 
[1] 0.1262586 
> dt[yr==2004&id %in% paste0(1:3)&deg=="1",mean(var)] 
[1] 0.4374115 
> dt[.(2004,paste0(1:3),"1"),mean(var)] 
[1] 0.4374115 

zu knacken, was los ist, änderte ich den fcn Code:

fcn <- function(yr,ids,deg){ 
    dt[.(yr,ids,deg),] 
} 

Welche ergibt:

> fcn(2004,paste0(1:3),"1") 
     yr id deg  var 
    1: 2000 1 1 0.5855288 
    2: 2000 2 2 -0.4534972 
    3: 2000 3 1 0.6058875 
    4: 2000 1 2 0.7094660 
    5: 2000 2 1 -0.1093033 
---      
116: 2005 2 2 -1.3247553 
117: 2005 3 1 0.1410843 
118: 2005 1 2 -1.1562233 
119: 2005 2 1 0.4224185 
120: 2005 3 2 -0.5360480 

Grundsätzlich fcn hat getan keine subsetting! Warum passiert dies? Wirklich frustriert.

Wenn ich nur einen Schlüssel statt drei, dt Teilsätze auf dem mittleren Schlüssel nur übergeben. Seltsam:

> fcn(2004,"1","1") 
     yr id deg  var 
    1: 2000 1 1 0.5855288 
    2: 2000 1 2 0.7094660 
    3: 2000 1 1 0.5855288 
    4: 2000 1 2 0.7094660 
    5: 2000 1 1 0.5855288 
---      
116: 2005 1 2 -1.1562233 
117: 2005 1 1 0.2239254 
118: 2005 1 2 -1.1562233 
119: 2005 1 1 0.2239254 
120: 2005 1 2 -1.1562233 

Aber wenn ich nur die mittleren Tasten an die Funktion übergeben, es funktioniert gut:

fcn <- function(ids){ 
    dt[.(2004,ids,"1")] 
} 
> fcn(paste0(1:3)) 
    yr id deg  var 
1: 2004 1 1 0.6453831 
2: 2004 2 1 -0.3043691 
3: 2004 3 1 0.9712207 

Finale edit: Problem gelöst, aber es wäre noch schön zu wissen, was genau schiefgeht:

Benennen Sie die Argumente:

fcn <- function(yyr,ids,ddeg){ 
    dt[.(yyr,ids,ddeg),mean(var)] 
} 

Irgendetwas über die Wiederverwendung der Spaltennamen als Variablennamen verursachte ein Problem, es scheint - aber ich verstehe immer noch nicht ganz, was schief gelaufen ist.

+0

Beschreibe dies, weil du es notieren musst, um Fehler zu beheben. – MichaelChirico

Antwort

7

Das Problem ist, Sie Namen von Spalten in Ihrem i-expression verwenden, aber erwarten sie Namen sein außerhalb der data.table. Sie können entweder die Variablennamen in Ihrer Funktion umbenennen oder die data.table außerhalb verbinden konstruieren und dann die Tatsache nutzen, dass für einzelne Namen data.table immer die äußere Umgebung verwenden:

fcn <- function(yr,ids,deg){ 
    tmp = data.table(yr, ids, deg) 
    dt[tmp, mean(var)] 
} 

fcn(2004, paste0(1:3), "1") 
#[1] 0.4374115 

Siehe FAQ 2,12-2,13.

+0

Das ist also im Grunde ein Umgebungsproblem - ich muss auf die Variablen 'yr' und' deg' zugreifen, aber '[.data.table' sieht zuerst im Bereich von' dt' und stoppt dort, wenn es diese Spalten findet (niemals in die Funktionsumgebung wechseln, wo die Werte, die ich an "yr" und "deg" übergebe, gespeichert werden. – MichaelChirico

+0

@MichaelChirico yep, das ist korrekt – eddi

+0

Ahhh, also warum 'fcn (2004," 1 "," 1 ") funktionierte, liegt daran, dass nur das mittlere Argument eindeutig benannt wurde (' ids' gegenüber 'id'). Hinterhältig. – MichaelChirico

Verwandte Themen