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)°=="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.
Beschreibe dies, weil du es notieren musst, um Fehler zu beheben. – MichaelChirico