programing

.SD는 R의 data.table에서 무엇을 나타냅니까?

muds 2023. 7. 5. 21:03
반응형

.SD는 R의 data.table에서 무엇을 나타냅니까?

.SD도움이 될 것 같지만, 저는 제가 그것으로 무엇을 하고 있는지 잘 모르겠습니다.그것은 무엇의 약자입니까? 완이유는정 (지전이간완▁what정)지() 사용할 때 일이 합니까?제가 그것을 사용할 때 무슨 일이 일어납니까?

읽음: 은 그룹 열을 제외한 각 그룹에 대한데이터 부분 집합을 포함합니다. 그룹화할 때, 그룹화할 때 , 키 입력 및 _adhoc_로 사용할 수 있습니다.

그 말은 그 딸이 그 아이를data.tables는 다음 작업을 위해 메모리에 저장됩니까?

.SD"와 같은 것을 의미합니다.S의부품의 속▁ofbs의 et▁uD테이블에"첫 번째는 의미가 없습니다."."사용자 정의 열 이름과 충돌할 가능성이 훨씬 낮다는 점을 제외하고는,

이것이 데이터인 경우.table:

DT = data.table(x=rep(c("a","b","c"),each=2), y=c(1,3), v=1:6)
setkey(DT, y)
DT
#    x y v
# 1: a 1 1
# 2: b 1 3
# 3: c 1 5
# 4: a 3 2
# 5: b 3 4
# 6: c 3 6

이렇게 하면 무엇을 볼 수 있는지 알 수 있습니다..SD다음과 같습니다.

DT[ , .SD[ , paste(x, v, sep="", collapse="_")], by=y]
#    y       V1
# 1: 1 a1_b3_c5
# 2: 3 a2_b4_c6

본적으로기,로,by=y원래 이 두 개의 데이터.table로 분할합니다.data.tables

DT[ , print(.SD), by=y]
# <1st sub-data.table, called '.SD' while it's being operated on>
#    x v
# 1: a 1
# 2: b 3
# 3: c 5
# <2nd sub-data.table, ALSO called '.SD' while it's being operated on>
#    x v
# 1: a 2
# 2: b 4
# 3: c 6
# <final output, since print() doesn't return anything>
# Empty data.table (0 rows) of 1 col: y

그리고 차례로 수술을 합니다.

두 가지 중 하나에서 작동하는 동안 현재 하위 항목을 참조할 수 있습니다.data.table/이름/이름/이름/이름/이름/이름/이름을 .SD할 수 때문에합니다.이라는 이름의 데이터를 사용할 수 있습니다.SD는, 여서제외는고하기는▁except고.data.table에서는 모든 항목에 이러한 합니다.data.table키 조합에 의해 정의되며, 키 조합을 "붙여 다시 붙여넣어" 결과를 단일로 반환합니다.data.table!

편집:

이 답변이 얼마나 호평을 받았는지를 고려하여, 저는 그것을 지금 여기서 이용할 수 있는 패키지 vignette로 변환했습니다.


이것이 얼마나 자주 발생하는지를 고려할 때, 저는 이것이 위의 조시 오브라이언이 제공한 유용한 답변 이상으로 조금 더 설명이 필요하다고 생각합니다.

Josh가 일반적으로 인용/생성한 데이터의 부분 집합 머리글자 외에도, "Self same" 또는 "Self-reference"를 나타내는 "S"를 고려하는 것도 도움이 된다고 생각합니다..SD그것의 가장 기본적인 모습은 반사적인 언급입니다.data.table그 자체 - 아래의 예에서 볼 수 있듯이, 이것은 특히 "접두사"를 함께 연결하는 데 도움이 됩니다(설명/설명/설명/예시).[) 특히, 이것은 또한 다음을 의미합니다..SD그 자체가 (와의 할당을 허용하지 않는다는 주의 사항 포함)입니다.:=).

의 더 간단한 .SD열 부분 집합을 위한 것입니다(즉, 다음과 같은 경우)..SDcols지정됨;); 이 훨씬하기 쉬운 하기 때문에 먼저 이 버전이 훨씬 이해하기 쉽다고 생각하기 때문에 먼저 아래에서 설명하겠습니다..SD 번사즉그시나오리화룹경우서같두에은용째다과음즉▁(▁scenarios(, 다음같은경)우▁in,▁groupingi)by = 또는keyby = 는 개념적으로 약간 다릅니다(비정렬 연산은 결국 하나의 그룹으로 그룹화하는 에지 케이스이기 때문에 핵심적으로는 동일하지만).


다음은 제가 자주 구현하는 몇 가지 예시적인 사용 사례와 다른 사용 사례입니다.

Lahman 데이터 로드 중

을 좀 더 느낌을 보다, 해 봅시다.Lahman:

library(data.table) 
library(magrittr) # some piping can be beautiful
library(Lahman)
Teams = as.data.table(Teams)
# *I'm selectively suppressing the printed output of tables here*
Teams
Pitching = as.data.table(Pitching)
# subset for conciseness
Pitching = Pitching[ , .(playerID, yearID, teamID, W, L, G, ERA)]
Pitching

벌거벗은.SD

반사적인 성격에 대해 제가 의미하는 바를 설명하기 위해..SD가장 진부한 사용법을 고려합니다.

Pitching[ , .SD]
#         playerID yearID teamID  W  L  G   ERA
#     1: bechtge01   1871    PH1  1  2  3  7.96
#     2: brainas01   1871    WS3 12 15 30  4.50
#     3: fergubo01   1871    NY2  0  0  1 27.00
#     4: fishech01   1871    RC1  4 16 24  4.35
#     5: fleetfr01   1871    NY2  0  1  1 10.00
#    ---                                       
# 44959: zastrro01   2016    CHN  1  0  8  1.13
# 44960: zieglbr01   2016    ARI  2  3 36  2.82
# 44961: zieglbr01   2016    BOS  2  4 33  1.52
# 44962: zimmejo02   2016    DET  9  7 19  4.87
# 44963:  zychto01   2016    SEA  1  0 12  3.29

즉, 우리는 방금 돌아왔습니다.Pitching즉, 이것은 지나치게 장황한 글쓰기 방식이었습니다.Pitching또는Pitching[]:

identical(Pitching, Pitching[ , .SD])
# [1] TRUE

는, 부집합의관서에점화분,.SD여전히 데이터의 하위 집합이며, 사소한 것일 뿐입니다(세트 자체).

부분 집합 설정: 열 부 집 설 정 합:.SDcols

무엇에 첫 입니까?.SD에 포함된 을 제한하는 것입니다..SD 사용.SDcols에 대한 인수입니다.[:

Pitching[ , .SD, .SDcols = c('W', 'L', 'G')]
#         W  L  G
#     1:  1  2  3
#     2: 12 15 30
#     3:  0  0  1
#     4:  4 16 24
#     5:  0  1  1
# ---         
# 44959:  1  0  8
# 44960:  2  3 36
# 44961:  2  4 33
# 44962:  9  7 19
# 44963:  1  0 12

이것은 단지 설명을 위한 것이고 꽤 지루했습니다.그러나 이러한 단순한 용도로도 매우 유익한 유비쿼터스 데이터 조작 작업을 다양하게 수행할 수 있습니다.

열 유형 변환

열 유형 변환은 데이터 멍에에에 대한 사실입니다. 이 글에서는 자동으로 읽거나 열을 읽을 수 없으며, 다음과 같은 변환을 앞뒤로 변환할 수 없습니다.character/factor/numeric흔합니다.우리는 사용할 수 있습니다..SD그리고..SDcols이러한 열의 그룹을 일괄 처리합니다.

의 열들이 다음열다저같장다니로 되어 있다는 .character에 시대에Teams데이터 세트:

# see ?Teams for explanation; these are various IDs
#   used to identify the multitude of teams from
#   across the long history of baseball
fkt = c('teamIDBR', 'teamIDlahman45', 'teamIDretro')
# confirm that they're stored as `character`
Teams[ , sapply(.SD, is.character), .SDcols = fkt]
# teamIDBR teamIDlahman45    teamIDretro 
#     TRUE           TRUE           TRUE 

사용법이 혼란스러운 경우sapply여기서, 기본 R과 동일하다는 것에 유의하십시오.data.frames:

setDF(Teams) # convert to data.frame for illustration
sapply(Teams[ , fkt], is.character)
# teamIDBR teamIDlahman45    teamIDretro 
#     TRUE           TRUE           TRUE 
setDT(Teams) # convert back to data.table

이 구문을 이해하는 핵심은 다음과 같습니다.data.table (으)로 표시)data.frame은 ( )과 같이 할 수 있습니다.list각입니다. 여서각 열즉 다니입 요소는기sapply/lapply를 적용합니다.FUN 열에 결과를 반환합니다.sapply/lapply보통은 그럴 것입니다(여기서는,FUN == is.character를 반환합니다.logical길이가 1인, 그래서sapply벡터)를 반환합니다.

을 이열다음변구문는으로 factor합니다. -- 매유사다니를 하면 됩니다. 간단히 추가하십시오.:=

Teams[ , (fkt) := lapply(.SD, factor), .SDcols = fkt]

우리는 포장해야 합니다.fkt 안에()R이 이름을 할당하는 대신 열 이름으로 해석하도록 강제합니다.fktRHS 로.

.SDcols):=을.character벡터 또는 aninteger열 위치의 벡터는 열 이름의 패턴 기반 변환에 유용할 수도 있습니다*.우리는 모든 것을 변환할 수 있습니다.factor에서 의까지.character:

fkt_idx = which(sapply(Teams, is.factor))
Teams[ , (fkt_idx) := lapply(.SD, as.character), .SDcols = fkt_idx]

다을포함모열변을다환니합든이 합니다.team로 돌아가다.factor:

team_idx = grep('team', names(Teams), value = TRUE)
Teams[ , (team_idx) := lapply(.SD, factor), .SDcols = team_idx]

명시적으로 열 번호 사용(예:DT[ , (1) := rnorm(.N)]열이 지남에 따라 가 자동으로 될 수 .는 잘못된 관행이며 열 위치가 변경되면 시간이 지남에 따라 코드가 자동으로 손상될 수 있습니다.숫자를 암시적으로 사용하더라도 번호가 매겨진 인덱스를 만들 때와 사용할 때의 순서를 스마트하고 엄격하게 제어하지 않으면 위험할 수 있습니다.

모델의 RHS 제어

다양한 모델 사양은 강력한 통계 분석의 핵심 기능입니다.투수의 평균자책점(Earned Runes Average, 경기력 측정치)을 예측하기 위해 사용할 수 있는 공변량의 작은 집합을 사용해 보겠습니다.Pitching표. 선의관는계(선형)의는?W와 (으)ㄹERA규격에 포함된 다른 공변량에 따라 달라집니다.

다음은 기능을 활용한 짧은 스크립트입니다..SD질문을 하는 것: 문질을탐구니다합이다니▁which▁explores.

# this generates a list of the 2^k possible extra variables
#   for models of the form ERA ~ G + (...)
extra_var = c('yearID', 'teamID', 'G', 'L')
models =
  lapply(0L:length(extra_var), combn, x = extra_var, simplify = FALSE) %>%
  unlist(recursive = FALSE)

# here are 16 visually distinct colors, taken from the list of 20 here:
#   https://sashat.me/2017/01/11/list-of-20-simple-distinct-colors/
col16 = c('#e6194b', '#3cb44b', '#ffe119', '#0082c8', '#f58231', '#911eb4',
          '#46f0f0', '#f032e6', '#d2f53c', '#fabebe', '#008080', '#e6beff',
          '#aa6e28', '#fffac8', '#800000', '#aaffc3')

par(oma = c(2, 0, 0, 0))
sapply(models, function(rhs) {
  # using ERA ~ . and data = .SD, then varying which
  #   columns are included in .SD allows us to perform this
  #   iteration over 16 models succinctly.
  #   coef(.)['W'] extracts the W coefficient from each model fit
  Pitching[ , coef(lm(ERA ~ ., data = .SD))['W'], .SDcols = c('W', rhs)]
}) %>% barplot(names.arg = sapply(models, paste, collapse = '/'),
               main = 'Wins Coefficient with Various Covariates',
               col = col16, las = 2L, cex.names = .8)

fit OLS coefficient on W, various specifications, depicted as bars with distinct colors.

계수는 항상 예상 부호(더 나은 투수는 더 많은 승리를 얻고 더 적은 득점이 허용되는 경향이 있음)를 가지고 있지만, 그 규모는 우리가 무엇을 위해 통제하느냐에 따라 상당히 달라질 수 있습니다.

조건부 조인

data.table구문은 단순함과 견고함 때문에 아름답습니다.x[i]부분 집합화에 대한 두 가지 일반적인 접근 방식을 유연하게 처리합니다.i입니다.logical 벡터,x[i]합니다.x어디에 해당하는지에 따라i이라TRUE 때에i는 또 다른, a입니다.join는 ( (일반적형태로, 하여다니)을 사용하여 수행됩니다.keyx그리고.i그렇지 않으면, 언제on = 해당 열의 일치 항목을 사용하여 지정됨).

이것은 일반적으로 훌륭하지만 테이블 간의 관계의 정확한 특성이 하나 이상의 열의 행 특성에 따라 달라지는 조건부 조인을 수행하려는 경우에는 부족합니다.

이 예는 약간 고안되었지만 아이디어를 설명합니다. 자세한 내용은 여기 (1, 2)를 참조하십시오.

입니다.team_performance에▁Pitching각 팀의 최고 투수(최소 6경기를 기록한 투수 중 최저 평균자책점으로 측정됨)의 팀 성과(순위)를 기록하는 표.

# to exclude pitchers with exceptional performance in a few games,
#   subset first; then define rank of pitchers within their team each year
#   (in general, we should put more care into the 'ties.method'
Pitching[G > 5, rank_in_team := frank(ERA), by = .(teamID, yearID)]
Pitching[rank_in_team == 1, team_performance := 
           # this should work without needing copy(); 
           #   that it doesn't appears to be a bug: 
           #   https://github.com/Rdatatable/data.table/issues/1926
           Teams[copy(.SD), Rank, .(teamID, yearID)]]

로 고는 다음과 .x[y]에서 문구반을 합니다.nrow(y)가치관, 그것이 이유입니다..SD는 의오쪽에있다니습에서 오른쪽에 .Teams[.SD] (θ RHS 이:=에는 이경는을요다니가 필요합니다.nrow(Pitching[rank_in_team == 1])가치.

된 됨화.SD

종종 그룹 차원에서 데이터에 대한 작업을 수행하려고 합니다.지정할 때by =(또는)keyby = ), ), 예를 참조하십시오.data.table »j당신을 생각하는 것입니다.data.table 요소 으로 분할됨에 data.table의 값은 s의 합니다.by변수:

A visual depiction of how grouping works. on the left is a grid. The first column is titled "ID COLUMN" with values the capital letters A through G, and the rest of the data is unlabelled, but is in a darker color and simply has "Data" written to indicate that's arbitrary. A right arrow shows how this data is split into groups. Each capital letter A through G has a grid on the right-hand side; the grid on the left has been subdivided to create that on the right.

이경에는우,,.SD입니다. -- 항목을 말합니다. 이것은 각각의 하위-data.tables, 한 에 한 번 (더 정확히 말하면, 의 범위).SD단일 하위 항목입니다.data.table이를 통해 재조립된 결과가 반환되기 전에 각 하위data.table 항목에 대해 수행할 작업을 간결하게 표현할 수 있습니다.

이는 다양한 설정에서 유용하며, 가장 일반적인 설정은 다음과 같습니다.

그룹 부분 집합 설정

라흐만 데이터에서 각 팀의 가장 최근 시즌 데이터를 받아보겠습니다.이 작업은 다음과 같이 매우 간단하게 수행할 수 있습니다.

# the data is already sorted by year; if it weren't
#   we could do Teams[order(yearID), .SD[.N], by = teamID]
Teams[ , .SD[.N], by = teamID]

을 하시오..SD가 그자가체입니다.data.table 그 그에밖.N그룹의 총 행 수를 나타냅니다.nrow(.SD)내), 그래서 각그룹내, 서그래서.SD[.N]각 행과 연결된 최종 행의 전체를 반환합니다.teamID.

이것의 또 다른 일반적인 버전은 다음과 같습니다..SD[1L]대신 각 그룹에 대한 첫 번째 관측치를 얻습니다.

그룹 옵티마

각 팀의 총 득점 수로 측정된 최고의 해를 반환하고 싶다고 가정합니다.R물론 다른 측정 기준을 참조하도록 쉽게 조정할 수 있습니다.)각각의 서브에서 고정된 요소를 취하는 대신에-data.table이제 원하는 인덱스를 다음과 같이 동적으로 정의합니다.

Teams[ , .SD[which.max(R)], by = teamID]

이 접근 방식은 물론 다음과 결합될 수 있습니다..SDcols 다니합환부의 합니다.data.table 자의에 .SD(그.SDcols다양한 하위 집합에 걸쳐 고정되어야 함)

NB:.SD[1L]현재 에 의해 최적화되었습니다(참고:data.table 일반적인 그룹화 향상시키는 작업입니다. 예를 들어 다 같 과 높 크 는 이 게 내 부 를 도 속 음 이 작 업 가 장 화sum또는mean 보다?GForce자세한 내용 및 기능 개선 요청에 대한 감시/음성 지원: 1, 2, 3, 4, 5, 6

그룹화된 회귀 분석

사이의 관계에 대한 위의 문의로 돌아가기ERA그리고.W이 관계가 팀에 따라 다를 것으로 예상한다고 가정합니다(즉, 팀마다 기울기가 다릅니다).는 이 분석을 이 을 다음과 할 수 . (이합니다. -- 은 -- 우 리 이 이 다 같 실 여 이 이 관 수 탐 을 있 의 질 할 다 부 - 니 습 정 격 규 다 니 합 확 로 으 적 일 반 표 는 오 구 류 성 준 의 시 접 법 계 근 는 행 게 ERA ~ W*teamID더 나을 것입니다. 이 접근 방식은 읽기 쉽고 계수는 정상입니다.):

# use the .N > 20 filter to exclude teams with few observations
Pitching[ , if (.N > 20) .(w_coef = coef(lm(ERA ~ W))['W']), by = teamID
          ][ , hist(w_coef, 20, xlab = 'Fitted Coefficient on W',
                    ylab = 'Number of Teams', col = 'darkgreen',
                    main = 'Distribution of Team-Level Win Coefficients on ERA')]

A histogram depicting the distribution of fitted coefficients. It is vaguely bell-shaped and concentrated around -.2

상당한 양의 이질성이 있는 반면, 관찰된 전체 값 주변에는 뚜렷한 농도가 있습니다.

바라건대 이것이 우리의 힘을 설명해 줬으면 합니다..SD아름답고 효율적인 코드를 용이하게 하는 데 있어.data.table!

저는 Matt Dowle과 이것에 대해 이야기한 후에 이것에 대한 비디오를 만들었습니다.SD, YouTube에서 보실 수 있습니다. https://www.youtube.com/watch?v=DwEzQuYfMsI

언급URL : https://stackoverflow.com/questions/8508482/what-does-sd-stand-for-in-data-table-in-r

반응형