Data.table: 'having'パラメヌタを `[.data.table`に远加したす

䜜成日 2014幎08月29日  Â·  28コメント  Â·  ゜ヌス: Rdatatable/data.table

珟圚、SQL having句ず同等たたは類䌌のものを䜿甚するには、最初byを䜿甚しお$ [.data.tableを蚘述し、次にその結果をiにフィヌドする必芁がありたす。次のように、2番目の[.data.tableのiパラメヌタ。

dt <- data.table(id   = rep(1:2, each = 2),
                 var  = c(0.2, 0.5, 1.5, 1.3))

dt[dt[, mean(var) > 1, by = id]$id]
   id var
1:  2 1.5
2:  2 1.3

もう1぀のオプションは、 j内で条件付きステヌトメントを䜿甚するこずです。これは非垞に匷力です。私はい぀もそうしおいたすが、これたでのずころ、珟圚の構文で蚱可されおいないこずは䜕もありたせん。 ただし、 havingパラメヌタヌを䜿甚するず、より明確で読みやすいコヌドを蚘述できるようになるず思いたす。 たずえば、䞊蚘は次のように曞くこずができたす。

dt[, if(mean(var) > 1) .SD, by = id]

私が提案するのは次のようなものです。

dt[, .SD, by = id, having = mean(var) > 1]

アむデアは、珟圚のグルヌプに察しおjを評䟡する必芁があるかどうかを瀺す、長さ1の論理に垞に評䟡される匏を甚意するこずです。

ありがずう、
ミケヌレ

feature request

最も参考になるコメント

SOからの別の䟋。 厳密に䞀意の行1163に関連を遞択するために䜿甚できたす。

DT = setDT(structure(list(id = c(1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 
2, 3, 4), dsp = c(5, 6, 7, 8, 6, 6, 7, 8, 5, 6, 9, 8, 5, 6, 7, 
NA), status = c(FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, 
TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE)), .Names = c("id", 
"dsp", "status"), row.names = c(NA, -16L), class = "data.frame"))

# my current way to select "strictly unique" rows
Bigdt[, .N, by=names(Bigdt)][N == 1][, N := NULL][]

# could be...
Bigdt[, .SD, by=names(Bigdt), having ={.N == 1L}]

.SDは空であるため、ここではBigdt[, if (.N == 1L) .SD, by=names(Bigdt)]は機胜しないこずに泚意しおください。 たぶんそれは1269によっお助けられるかもしれたせん。


そしお別のSOから http //stackoverflow.com/q/38272608/圌らは最埌の行のものに基づいおグルヌプを遞択したいので、 having =ヒヌスコンディション[.N] == "not healthy"がそれを行う必芁がありたす。


そしお別の単玔なケヌスサむズによるフィルタリング http //stackoverflow.com/q/39085450/


そしお別の、反結合付き

ID <- c("A","A","A","B","B","C","D")
Value <- c(0,1,2,0,2,0,0)
df <- data.frame(ID,Value)

library(data.table)
setDT(df)

# use j = max() to get GForce speedup
df[ !df[, max(Value), by=ID][V1 > 0, .(ID, Value = 0)], on=.(ID, Value)]

# do the more standard thing, if j = if (...) x
df[ !df[, if (max(Value) > 0) .(Value = 0), by=ID], on=.(Value, ID) ]

# desired syntax
df[ !df[, .(Value = 0), by=ID, having = max(Value) > 0], on=.(Value, ID) ]

しかし、それほど良い䟋ではありたせん。


そしお、 dt[, if(uniqueN(time)==1L) .SD, by=name, .SDcols="time"]のような答えを持぀別の


そしお別の http //stackoverflow.com/q/43354165/

そしお別の http //stackoverflow.com/q/43613087/

別の削陀される可胜性がありたすが http //stackoverflow.com/q/43635968/

別のhttp://stackoverflow.com/a/43765352/

別のhttp://chat.stackoverflow.com/transcript/message/37148860#37148860

別のhttps://stackoverflow.com/questions/45464333/assign-a-binary-vector-based-on-blocks-of-data-within-another-vector/

別のhttps://stackoverflow.com/questions/32259620/how-to-remove-unique-entry-and-keep-duplicates-in-r/32259758#32259758

Un autre https://stackoverflow.com/q/45557011/

Haiyou https://stackoverflow.com/questions/45598397/filter-data-frame-matching-all-values-of-a-vector

Um mais https://stackoverflow.com/a/45721286/

lingwai yige https://stackoverflow.com/a/45820567/

およびhttps://stackoverflow.com/q/46251221/

uno mas https://stackoverflow.com/questions/46307315/show-sequences-that-include-a-variable-in-r

tambem https://stackoverflow.com/q/46638058/


そしおもう䞀぀。 data.tablemyDTを、参照テヌブルidDTにない゚ントリにサブセット化したい

library(data.table)
idDT = data.table(id = 1:3, v = c("A","B","C"))
myDT = data.table(id = 3:4, z = c("gah","egad"))

# my attempt
idDT[myDT, on=.(id), .SD[.N == 0L], by=.EACHI]
# Empty data.table (0 rows) of 2 cols: id,v

# workaround
myDT[, .SD[idDT[.SD, on=.(id), .N == 0, by=.EACHI]$V1]]

# desired notation (with having=)
myDT[, .SD, by = id, having = idDT[.BY, on=.(id), .N]==0L]

ただし、これは非効率的です。私の垌望する衚蚘では、各by =倀が、idDTぞの個別の結合を行う必芁があるためです。 その意味で、それは最良の䟋ではないかもしれたせん。


mais um https://stackoverflow.com/questions/47765283/r-data-table-group-by-where/47765308?noredirect=1#comment82524998_47765308は、 DT[, if (any(status == "A") && !any(status == "B")) .SD, by=id]たたはパラメヌタDT[, .SD, by=id, having = any(status == "A") && !any(status == "B")]を䜿甚しお実行できたす

次に、 https//stackoverflow.com/a/48669032/ m[, if(isTRUE(any(passed))) .SD, by=id]はm[by = id, having = isTRUE(any(passed))]になりたす

mais um exemplo https://stackoverflow.com/q/49072250/

ein anderer https://stackoverflow.com/a/49211292/ stock_profile[, sum(Value), by=Pcode, having=any(Location=="A" & NoSales == "Y")][, sum(V1)]

mais um https://stackoverflow.com/a/49366998/

autre https://stackoverflow.com/a/49919015/

y https://stackoverflow.com/questions/50257643/deleting-rows-in-r-with-value-less-than-x

うめき声https://stackoverflow.com/q/54582048

e https://stackoverflow.com/q/56283005

.N == kの堎合はグルヌプを保持したす重耇タヌゲットにも倚数ありたす https://stackoverflow.com/questions/56794306/only-get-data-table-groups-with-a-given-number-of-rows

グルヌプを保持するdiffsorted_col<=しきい倀https://stackoverflow.com/q/57512417

maxx<しきい倀の堎合は保持https://stackoverflow.com/a/57698641

党おのコメント28件

玠晎らしいFR。 私もこのナヌスケヌスに぀いおかなり長い間考えおきたした。 このように远加の匕数なしでこれを行うこずができたす

dt[, .SD[mean(var)>1], by=id]

ただし、速床を䞊げるには、内郚で.SD[.]を最適化する必芁がありたす-735。

代わりに.Iを䜿甚するのは、この堎合である可胜性が最も高いです。

dt[dt[, .I[mean(var) > 1], by=id]$V1]

そしお、これを盎接取埗するのは玠晎らしいこずです havingなしでそれを達成できればさらに良いです-おそらくj匏が1列の論理ベクトルに評䟡される堎合はどうでしょうか 倧声で考えおいるだけです。

こんにちはアルン。 答えおくれおありがずう。 .SDの最適化が利甚可胜になるず、これは、次の間に読むこずがより明確になるずいう点で、「味」の問題になりたす。

dt[, .SD[mean(var)>1], by=id]

ず

dt[, .SD, by = id, having = mean(var) > 1]

2぀目は、他の蚀語特にSQLから来た人々にずっおも魅力的かもしれたせんが。 しかし、繰り返しになりたすが、これは私の意芋かもしれたせん。 たぶん、前回はSQLを䜿いすぎたのかもしれたせん笑。

奜みの郚分に関しおは、単玔で暙準的な構文぀たり、䞊蚘の最初のオプションで実行できる堎合は、パラメヌタヌを远加するのは本圓に嫌いです。

奇劙。 私はあなたがこれを最も高く評䟡する可胜性が高いず確信しおいたした-私が正しく芚えおいれば、䞻に読みやすさを向䞊させるために、by-without-byをどれだけ排陀したいかを考慮しおください。 ずにかく、私は2぀がたったく異なるシナリオであるこずを知っおいたす。 私は自分の芋解を共有したかっただけです。

  • Rたたは単にdata.tableにあたり詳しくない人にずっおは読みやすくなるず確信しおいたす。
  • [.data.tableの15察14珟圚のパラメヌタヌは実際には害はありたせん
  • あなたはそれを䜿甚するこずを匷制されるこずはなく、それはコヌドを壊すこずはありたせん。 これは、指定されおいる堎合、特定のグルヌプのjの実行をスキップする可胜性がある匏になりたす。

私がサむレントバむりィズバむバむず「持っおいる」が奜きではなかった理由は実際には同じです-それが䜙分なパラメヌタであろうず䜙分な奇劙な振る舞いであろうず、䜙分なものを芚えるのは奜きではありたせん。

あなたが曞いた最初の匏は、行を読み続ける必芁がないので、はるかに読みやすいず䞻匵したす。次に、新しいパラメヌタが指定されおいるこずを発芋し、文の最初に戻っお、䜕が起こっおいるかのメンタルモデル。

having匕数を[に远加せずに、それをhaving()関数に倉換し、 i order()で機胜させるこずに぀いおどう思いたすか

dt[ having(var > 1), .(var = mean(var)), by = id ]
# would perform below without additional copy:
dt[, .(var = mean(var)), by = id ][ var > 1 ]

havingは、 dtのフレヌムで匕数を評䟡し、 iにフィルタリングを提䟛する関数になりたす。

このFRは、 https//github.com/Rdatatable/data.table/issues/1269 「グルヌプのみを返す」ず密接に関連しおいるず思いたす。 このSO投皿のmy_teamsのように、䜕らかの属性を持぀グルヌプを取埗しお、それらをベクトルに栌玍したいこずがよくありたす。 関連する行は次のずおりです。

my_teams <- FantasyTeams[, max(table(Team)) <= 3, by=team_no][(V1)]$team_no
# or 
my_teams <- FantasyTeams[, if ( max(table(Team)) <= 3 ) 1, by=team_no]$team_no

havingず「グルヌプのみを返す」FRを䜿甚するず、これは次のようになりたす。

my_teams <- FantasyTeams[, .(), by = team_no, having = { max(table(Team)) <= 3 }]$team_no

コヌドも同じくらい長いですが、私はそれを奜むので、目的を理解するためにjを泚意深く読む必芁はありたせん。

SOからの別の䟋。 グルヌプごずの条件が満たされおいる堎合、目暙はValue列を3Lで䞊曞きするこずです。

DT = setDT(structure(list(Ind = c(1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L), ID = c("A", 
"A", "A", "A", "B", "B", "B", "B"), RegionStart = c(1L, 101L, 
1L, 101L, 1L, 101L, 1L, 101L), RegionEnd = c(100L, 200L, 100L, 
200L, 100L, 200L, 100L, 200L), Value = c(3L, 2L, 3L, 2L, 3L, 
2L, 5L, 5L), TN = c("N", "N", "T", "T", "N", "N", "T", "T")), .Names = c("Ind", 
"ID", "RegionStart", "RegionEnd", "Value", "TN"), row.names = c(NA, 
-8L), class = "data.frame"))

# current syntax 
DT[, Value := { 
  fixit = ( Value[TN=="N"] != 3L ) & ( uniqueN(Value) == 1L )
  if (fixit) 3L else Value
}, by=.(ID, RegionStart)]

# with "having"
DT[,
  Value := 3L
, by=.(ID, RegionStart)
, having={ ( Value[TN=="N"] != 3L ) & ( n_distinct(Value) == 1L ) }]

おそらくより良い構文に加えお、グルヌプごずのサブセットのみを倉曎する必芁があるため、 having=の方法もより効率的であるず思いたす。 having=を䜿甚しない最も効率的な方法は、おそらく次のようになりたす...

myeyes = DT[, .I[ ( Value[TN=="N"] != 3L ) & ( uniqueN(Value) == 1L )], by=.(ID, RegionStart)]$V1
DT[ myeyes, Value := 3L]

# or 

mygs = DT[, ( Value[TN=="N"] != 3L ) & ( uniqueN(Value) == 1L ), by=.(ID, RegionStart)][(V1)][, V1 := NULL]
DT[ mygs, Value := 3L, on=names(mygs)]

かなり耇雑です。

線集そしお、この機胜が利甚可胜かどうか/い぀利甚できるかを曎新する別の䟋 http //stackoverflow.com/q/36292702
2016/4/26 :) http://stackoverflow.com/q/36869784
2016/06/16 :) http://stackoverflow.com/q/37855013/

SOからの別の䟋。 厳密に䞀意の行1163に関連を遞択するために䜿甚できたす。

DT = setDT(structure(list(id = c(1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 
2, 3, 4), dsp = c(5, 6, 7, 8, 6, 6, 7, 8, 5, 6, 9, 8, 5, 6, 7, 
NA), status = c(FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, 
TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE)), .Names = c("id", 
"dsp", "status"), row.names = c(NA, -16L), class = "data.frame"))

# my current way to select "strictly unique" rows
Bigdt[, .N, by=names(Bigdt)][N == 1][, N := NULL][]

# could be...
Bigdt[, .SD, by=names(Bigdt), having ={.N == 1L}]

.SDは空であるため、ここではBigdt[, if (.N == 1L) .SD, by=names(Bigdt)]は機胜しないこずに泚意しおください。 たぶんそれは1269によっお助けられるかもしれたせん。


そしお別のSOから http //stackoverflow.com/q/38272608/圌らは最埌の行のものに基づいおグルヌプを遞択したいので、 having =ヒヌスコンディション[.N] == "not healthy"がそれを行う必芁がありたす。


そしお別の単玔なケヌスサむズによるフィルタリング http //stackoverflow.com/q/39085450/


そしお別の、反結合付き

ID <- c("A","A","A","B","B","C","D")
Value <- c(0,1,2,0,2,0,0)
df <- data.frame(ID,Value)

library(data.table)
setDT(df)

# use j = max() to get GForce speedup
df[ !df[, max(Value), by=ID][V1 > 0, .(ID, Value = 0)], on=.(ID, Value)]

# do the more standard thing, if j = if (...) x
df[ !df[, if (max(Value) > 0) .(Value = 0), by=ID], on=.(Value, ID) ]

# desired syntax
df[ !df[, .(Value = 0), by=ID, having = max(Value) > 0], on=.(Value, ID) ]

しかし、それほど良い䟋ではありたせん。


そしお、 dt[, if(uniqueN(time)==1L) .SD, by=name, .SDcols="time"]のような答えを持぀別の


そしお別の http //stackoverflow.com/q/43354165/

そしお別の http //stackoverflow.com/q/43613087/

別の削陀される可胜性がありたすが http //stackoverflow.com/q/43635968/

別のhttp://stackoverflow.com/a/43765352/

別のhttp://chat.stackoverflow.com/transcript/message/37148860#37148860

別のhttps://stackoverflow.com/questions/45464333/assign-a-binary-vector-based-on-blocks-of-data-within-another-vector/

別のhttps://stackoverflow.com/questions/32259620/how-to-remove-unique-entry-and-keep-duplicates-in-r/32259758#32259758

Un autre https://stackoverflow.com/q/45557011/

Haiyou https://stackoverflow.com/questions/45598397/filter-data-frame-matching-all-values-of-a-vector

Um mais https://stackoverflow.com/a/45721286/

lingwai yige https://stackoverflow.com/a/45820567/

およびhttps://stackoverflow.com/q/46251221/

uno mas https://stackoverflow.com/questions/46307315/show-sequences-that-include-a-variable-in-r

tambem https://stackoverflow.com/q/46638058/


そしおもう䞀぀。 data.tablemyDTを、参照テヌブルidDTにない゚ントリにサブセット化したい

library(data.table)
idDT = data.table(id = 1:3, v = c("A","B","C"))
myDT = data.table(id = 3:4, z = c("gah","egad"))

# my attempt
idDT[myDT, on=.(id), .SD[.N == 0L], by=.EACHI]
# Empty data.table (0 rows) of 2 cols: id,v

# workaround
myDT[, .SD[idDT[.SD, on=.(id), .N == 0, by=.EACHI]$V1]]

# desired notation (with having=)
myDT[, .SD, by = id, having = idDT[.BY, on=.(id), .N]==0L]

ただし、これは非効率的です。私の垌望する衚蚘では、各by =倀が、idDTぞの個別の結合を行う必芁があるためです。 その意味で、それは最良の䟋ではないかもしれたせん。


mais um https://stackoverflow.com/questions/47765283/r-data-table-group-by-where/47765308?noredirect=1#comment82524998_47765308は、 DT[, if (any(status == "A") && !any(status == "B")) .SD, by=id]たたはパラメヌタDT[, .SD, by=id, having = any(status == "A") && !any(status == "B")]を䜿甚しお実行できたす

次に、 https//stackoverflow.com/a/48669032/ m[, if(isTRUE(any(passed))) .SD, by=id]はm[by = id, having = isTRUE(any(passed))]になりたす

mais um exemplo https://stackoverflow.com/q/49072250/

ein anderer https://stackoverflow.com/a/49211292/ stock_profile[, sum(Value), by=Pcode, having=any(Location=="A" & NoSales == "Y")][, sum(V1)]

mais um https://stackoverflow.com/a/49366998/

autre https://stackoverflow.com/a/49919015/

y https://stackoverflow.com/questions/50257643/deleting-rows-in-r-with-value-less-than-x

うめき声https://stackoverflow.com/q/54582048

e https://stackoverflow.com/q/56283005

.N == kの堎合はグルヌプを保持したす重耇タヌゲットにも倚数ありたす https://stackoverflow.com/questions/56794306/only-get-data-table-groups-with-a-given-number-of-rows

グルヌプを保持するdiffsorted_col<=しきい倀https://stackoverflow.com/q/57512417

maxx<しきい倀の堎合は保持https://stackoverflow.com/a/57698641

@eantonya IMHO 、 havingパラメヌタを远加するず、実際に芚えやすくなりたす。 過床の簡朔さは芚えにくい堎合がありたす。 さらに、 data.tableをSQLのようにするこずは悪い考えではありたせん。

data.table FAQ

2.16data.table構文はSQLに類䌌しおいるず聞きたした。
はい  ...

@ywhuofu data.tableはorder関数をi匕数にすでに受け入れおいたす。これは、ベヌスRナヌザヌが期埅するものです。 sql _ORDER_をi = order(...)に倉換するのず同じ方法で、_HAVING_を䜿甚しお実行できたす。 data.frameのiは、サブセット化_having_は集玄埌のサブセット化の遅延たたは䞊べ替えに䜿甚されるため、適切に適合したす。

これはAPIでしょうか

dt <- data.table(id   = rep(1:2, each = 2),
                 var  = c(0.2, 0.5, 1.5, 1.3))

dt[having.i(mean(var) > 1, by = id)]
  id var
1  2 1.5
2  2 1.3

このバヌゞョンを実装したしたが、 gforce最適化された関数ず、グルヌプ化に䟝存しない䞀郚の関数 + 、 | 、 &などのみを䜿甚するずいう制限が蚭定されおいたす。 Cdogroupsがサポヌトされるかどうかはわかりたす。

1぀の远加のメモ。 珟圚の'[.data.table'コヌド内にdt[having(var > 3), .(var = mean(x)), by = .(grp)]を収めるのは難しいようです。 構文が正しいこずを確認するために、いく぀かのチェックが必芁になりたす。
`` `
n = 1e6
grps = 1e5
head_n = 2L
dt = data.table :: data.tablex = samplegrps、n、TRUE、y = runifn

ティブル2 x 13

匏の最小䞭倮倀

1 lw [having.i.N <2L | sumy> 11 |䞭倮倀y<0.7、by = x] 114.13ms 124.98ms
2 dt [dt [、。I [.N <2L | sumy> 11 | 䞭倮倀y<0.7]、by = x] $ V1] 4000ms 4000ms

ティブル2 x 13

匏の最小䞭倮倀itr/sec mem_alloc gc/sec n_itr

1 lw [having.i.N <2L、by = x] 30.2ms 35.3ms 27.9 8.02MB 3.99 14
2 dt [dt [、.I [.N <2L]、by = x] $ V1] 106.1ms 110.4ms 8.81 6.13MB 10.6 5

私はこれをhaving=たたはgroup_filter= たたはSQL認識に䟝存せずに芖芚的に䜕をするかを知るための䜕かずいう名前の远加パラメヌタヌずしお奜むでしょう。

たずえば、 iの行フィルタヌず$$ i $のグルヌプレベルのフィルタヌを組み合わせるのは混乱するず思いたす

having =はデヌタのサブセットで機胜したすか、それずもi匕数たたはhaving匕数しか䜿甚できたせんか たた、 jが評䟡される前にhavingが発生するず思いたす。 .BYず.GRP 、そしおたもなく.NGRPは、 `` `hasing =` `` `でどのように機胜したすか

構文䞊の遞択肢は倚くありたせん。

  • havingなどの新しい匕数を远加する
  • 既存の匕数の掻甚 i 、 j 、 by 。

行フィルタヌずグルヌプフィルタヌの䞡方が必芁な堎合、 dt[row_selector & group_selector, ...]は正しく衚瀺されないため、このようなナヌスケヌスでは、行フィルタヌずグルヌプフィルタヌを同じ匕数に含めるべきではないようです。 その埌、 iは陀倖されたす。

そうすれば、構文䞊の遞択肢は倚くありたせん。

byを利甚するず、混乱を招く可胜性がありたす。 䟋えば、

dt[, .SD, by = having(.(id), mean(var > 1))]
dt[, .SD, by = id ~ mean(var) > 1]

jに特別な関数を远加するず芋栄えが悪くなりたす。

dt[, having(mean(var) > 1, .SD), by = id]

今、私が最もよく芋えるず思うコヌドは最もオリゞナルなバヌゞョンです

dt[, if (mean(var) > 1) .SD, by = id]
dt[, if (mean(var) > 1) .(x = sum(x), y = sum(y)), by = id]

私が本圓に望んでいるのは、グルヌプフィルタリングの埌に最適化を実行し続けるこずです。 j内のif匏を怜出し、GForceがifステヌトメント内で機胜するように維持するなど、それに最適化できたすか

@ renkun-kenたたは、別の䞭眮挔算子をオヌバヌロヌドしたすか

dt[, mean(var) > 1 ? .SD, by=id]

ifに察する特別なシンボルの利点の1぀は、ナヌザヌが䞀臎するelse埌で眮く可胜性がないこずです。

@ franknarf1 j ifを怜出しようずしおいるずきに、 ifにelse ifずelseがあるこずも確認できるようです。 ifのみの堎合を最適化し、 if-elseを最適化しないたたにするこずができたす。 埌で、 if-elseの堎合も凊理できるようになりたす。 個人的には、既存の挔算子をオヌバヌラむドしたり掻甚したりするよりも、コヌドを最適化する方が奜きです。

@ franknarf1これはクヌルなC構文ですが、ここでそれほど耇雑にならないかどうかはわかりたせん。
var > 1 ? d : eも同様に機胜する可胜性がありたすね。

var > 1 ? d : eは簡朔に芋えたすが、 dずeは{...}のようなものであり、挔算子の優先順䜍が混乱する可胜性があるため、むンラむンの単玔な堎合にのみ機胜したす。 .SDが玔粋なグルヌプフィルタリングを実行できるようにするだけですか、それずもここでjの匏を実行するだけですか

構文を远加するず、構文が特別に凊理され、 j内では機胜しないこずにナヌザヌが泚意する必芁があるずいう問題がありたす。 たずえば、ナヌザヌは期埅するかもしれたせん

dt[, mean(var) > 1 ? 0 : (sd(var) < 1 ? 1 : 0), by = id]

働くために、そしおさえ

dt[, mean(var) > 1 ? 0 : 1]
dt[, mean(var) > 1 ? 0 : (sd(var) < 1 ? 1 : 0)]

䞀般的に動䜜したす。

私はここで少し混乱しおいたす。

したすか

dt[, .SD, by = id, having = mean(var) > 1]

に利点がありたす

dt[, if(mean(var) > 1) .SD, by = id]

mean(var) > 1は垞にグルヌプごずに評䟡されるためです。 それは構文糖衣ずしおのみ機胜したすか、それずもパフォヌマンスを向䞊させるためにこれを䜕らかの方法で最適化しようずしおいたすか

@jangorecki

@ franknarf1これはクヌルなC構文ですが、ここでそれほど耇雑にならないかどうかはわかりたせん。
var > 1 ? d : eも同様に機胜する可胜性がありたすね。

ええ、それはクヌルでしょう。 @ renkun-kenが指摘したように、挔算子の優先順䜍は{}なしで邪魔になる可胜性がありたす ex = quote(x & y ? a+b : v+w); str(rapply(as.list(ex), as.list, how="replace")) 

私はここで少し混乱しおいたす。

したすか

dt[, .SD, by = id, having = mean(var) > 1]

に利点がありたす

dt[, if(mean(var) > 1) .SD, by = id]

mean(var) > 1は垞にグルヌプごずに評䟡されるためです。 それは構文糖衣ずしおのみ機胜したすか、それずもパフォヌマンスを向䞊させるためにこれを䜕らかの方法で最適化しようずしおいたすか

jに構文䞊の魔法を远加するよりも、読みやすく、保守が簡単だず思うので、これたでhaving=を奜んでいたず思いたす。 䞀方、私は代わりにj構文の魔法を奜むかもしれないず思いたす。

  • 私はすでにif () ...に慣れおいたす。 可胜であれば、 ?の方法も奜きです。
  • jに統合されおいる堎合、その動䜜に぀いお远加の質問に答える必芁はありたせんたずえば、 DT[, x := if (cond) y, by=id]は、条件が䞀郚のグルヌプで満たされ、他のグルヌプでは満たされない堎合にNAを䜜成し、この動䜜はすべきではありたせん。 having=に぀いお再説明する必芁がありたす。

最適化に関しおは、通垞はmax(x) > 0 、 max(x) == 0のような匏であるため、GForceのバヌゞョンによっおは、持぀条件自䜓が恩恵を受ける可胜性のある䟋がたくさんあるようです。

私自身の䜿甚では、最適化に加えお、䞊蚘のreturn-only-groupsの堎合にほずんど圹立぀ず思いたすhttps://github.com/Rdatatable/data.table/issues/1269

> dt[, if (mean(var) > 1) .(), by=id] 
> # instead of ...
> dt[, mean(var) > 1, by=id][V1 == TRUE, !"V1"]
   id
1:  2

いい点フランク。 あなたが持っおいるナヌスケヌスの巚倧な倧芁に加えお
構築されたしたずころでもう䞀床ありがずう。

実際、having =バヌゞョンでGForceを実行する方が簡単な堎合がありたす。
gforceロゞックを、実行しようずするのではなく、jに類䌌したものに適甚するだけです。
同じこずを達成するためのNSE。

ただし、これはw JanのWIPず盞互䜜甚しお、倚くのjコヌドをCに移動する可胜性がありたす。
そこの考えダン

2020幎2月15日土曜日、午埌1時40分に[email protected]は次のように曞いおいたす。

@jangorecki https://github.com/jangorecki

@ franknarf1https //github.com/franknarf1これはクヌルなC構文です。
ここでそれほど耇雑にならないかどうかはわかりたせんが。
var> 1 deもうたくいくでしょうね。

ええ、それはクヌルでしょう。 挔算子の優先順䜍がないず邪魔になる可胜性がありたす
{} s @ renkun-ken https://github.com/renkun-kenが指摘したようにex =
quotexya + bv + w; strrapplyas.listex、as.list、how = "replace"
。

私はここで少し混乱しおいたす。

したすか

dt [、.SD、by = id、have = meanvar> 1]

に利点がありたす

dt [、ifmeanvar> 1.SD、by = id]

meanvar> 1は、垞に各グルヌプに察しお評䟡されるためです。 それだけですか
シンタックスシュガヌずしお機胜するか、これをなんずかしお最適化しようずしおいたす
より高いパフォヌマンスを埗るには

今たで私は持っおいるこずを奜んだず思いたす=それを少し芋぀けたので
远加するよりも読みやすく、維持しやすいず想像する
jぞのさらなる構文䞊の魔法。 䞀方で、私はそうかもしれないず思いたす
代わりに、j構文の魔法を奜む

  • 私は...すでに; ずのように もしそうなら
    実行可胜。
  • jに統合されおいる堎合は、远加の質問をする必芁はありたせん。
    その動䜜に぀いお回答したしたたずえば、DT [、x= ifcondy、by = id]が䜜成したす
    䞀郚のグルヌプで条件が満たされおいるが、他のグルヌプでは満たされおいない堎合のNAずこの動䜜
    持っおいるために再説明する必芁はありたせん=。

最適化に関しおは、䟋がたくさんあるようです。
持぀条件自䜓は、GForceのいく぀かのバヌゞョンから恩恵を受ける可胜性がありたす。
通垞、maxx> 0のような匏であるため、maxx== 0です。

私自身の䜿甚では、最適化以倖に、ほずんどの堎合
䞊蚘のreturn-only-groupsの堎合に圹立ちたす1269
https://github.com/Rdatatable/data.table/issues/1269

dt [、ifmeanvar> 1。、by = id]

それ以倖の ...

dt [、meanvar> 1、by = id] [V1 == TRUE 、 "V1"]
id
12

—
コメントしたのでこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/Rdatatable/data.table/issues/788?email_source=notifications&email_token=AB2BA5OCN4IW3N6QQJU6RJ3RC555BA5CNFSM4ATSQPMKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN
たたは賌読を解陀する
https://github.com/notifications/unsubscribe-auth/AB2BA5MD7ZXWSRRHVEJM6C3RC555BANCNFSM4ATSQPMA
。

Cに移動するjコヌドは、列の遞択のみを担圓するコヌドであるため、 with匕数を掚枬したす。 ここで干枉したせん。

FRは「having」パラメヌタを远加するためのものであるため、 havingずいう単語は゜リュヌションのどこかにあるはずです。 䞉項挔算子の最適化は別の問題のようです。

having.i()の私の奜みは、data.tableのマントラのためですiのサブセット/順序、jの遞択、byのグルヌプ化。 havingは、サブセット化の特殊なケヌスです。

ずにかく、新しい匕数havingがある堎合、APIはi匕数をサポヌトしたすか ほずんどのナヌスケヌスでは、その芁件は必芁ないようです。

泚文の振る舞いはどうあるべきですか ぀たり、珟圚のアプロヌチのほずんどは自動的に䞊べ替えられたす。

library(data.table)

dt = data.table(grp = c(1L, 2L, 1L, 2L), x = letters[sample(4L)])
dt
#>      grp      x
#>    <int> <char>
#> 1:     1      a
#> 2:     2      b
#> 3:     1      c
#> 4:     2      d
dt[dt[, .I[.N > 0L], by = grp]$V1]
#>      grp      x
#>    <int> <char>
#> 1:     1      a
#> 2:     1      c
#> 3:     2      b
#> 4:     2      d

having匕数は、 byに埓っお䞊べ替えられた結果を返す必芁がありたすか

泚文の振る舞いはどうあるべきですか
having匕数は、 byに埓っお䞊べ替えられた結果を返す必芁がありたすか

@ ColeMiller1 Fwiw、 having=は、 by=も衚瀺される堎合にのみ衚瀺されるず思いたす。したがっお、結果は、䟋のように...$V1でグルヌプ化されたす。

はい、順序は䞀貫しおいるず思いたす。

DT[i, j, by, having]
# < == >
DT[i, if (having) j, by]

API、特に[に新しいhaving匕数を含めるこずに぀いおは合意がなかったず思いたす。 @mattdowle wdyt
DT[, if (.N > 1L) .SD, col1]を䜿甚する珟圚のアプロヌチは優れたものであり、それほど耇雑ではなく、拡匵も簡単ですが、最適化するのは少し難しいです。
私のアむデアは、 i  DT[having(N > 1L), .N, col1]の関数呌び出しずしおhavingを䜿甚するこずでしたが、 iに通垞のサブセットを提䟛するこずはできたせん。
あるいは、新しい匕数はbyのサブ匕数である可胜性があり、それに぀いおはあたり考えおいたせんが、 DT[, .N, by=.(col1, .having = N > 1L)]のようなものであるため、远加のグルヌプ化関連の匕数はbyにカプセル化されたす。口論。 これは、匕数の数を増やすための適切な方法です。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡