.SD는 R의 data.table에서 무엇을 나타냅니까?
.SD
도움이 될 것 같지만, 저는 제가 그것으로 무엇을 하고 있는지 잘 모르겠습니다.그것은 무엇의 약자입니까? 완이유는정 (지전이간완▁what정)지() 사용할 때 일이 합니까?제가 그것을 사용할 때 무슨 일이 일어납니까?
읽음: 은 그룹 열을 제외한 각 그룹에 대한 의 데이터 부분 집합을 포함합니다. 그룹화할 때, 그룹화할 때 , 키 입력 및 _adhoc_로 사용할 수 있습니다.
그 말은 그 딸이 그 아이를data.table
s는 다음 작업을 위해 메모리에 저장됩니까?
.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이 이름을 할당하는 대신 열 이름으로 해석하도록 강제합니다.fkt
RHS 로.
.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)
계수는 항상 예상 부호(더 나은 투수는 더 많은 승리를 얻고 더 적은 득점이 허용되는 경향이 있음)를 가지고 있지만, 그 규모는 우리가 무엇을 위해 통제하느냐에 따라 상당히 달라질 수 있습니다.
조건부 조인
data.table
구문은 단순함과 견고함 때문에 아름답습니다. 문x[i]
부분 집합화에 대한 두 가지 일반적인 접근 방식을 유연하게 처리합니다.i
입니다.logical
벡터,x[i]
합니다.x
어디에 해당하는지에 따라i
이라TRUE
때에i
는 또 다른, a입니다.join
는 ( (일반적형태로, 하여다니)을 사용하여 수행됩니다.key
x
그리고.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
변수:
이경에는우,,.SD
입니다. -- 항목을 말합니다. 이것은 각각의 하위-data.table
s, 한 번에 한 번 (더 정확히 말하면, 의 범위).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')]
상당한 양의 이질성이 있는 반면, 관찰된 전체 값 주변에는 뚜렷한 농도가 있습니다.
바라건대 이것이 우리의 힘을 설명해 줬으면 합니다..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
'programing' 카테고리의 다른 글
MongoDB: 대량 삽입(Bulk.insert) 대 다중 삽입(삽입([...])) (0) | 2023.07.05 |
---|---|
두 데이터 프레임에 서로 다른 열 집합이 있는 경우 행(rbind)으로 결합 (0) | 2023.07.05 |
Oracle SQL에서 인덱스를 표시하는 방법 (0) | 2023.07.05 |
파이썬에서 최상위 디렉터리만 나열하는 방법은 무엇입니까? (0) | 2023.07.05 |
C에서 부울(부울)은 얼마나 많은 공간을 차지합니까?1비트인가요, 1바이트인가요? (0) | 2023.07.05 |