이 문제는 나를 미치게 만든다.
먼저이 예제 데이터 세트가 있다고 가정 해 보겠습니다.
set.seed(42)
dt <- data.table(mydate = seq(as.Date("2009-01-01"), as.Date("2012-01-01"), by = "day"),
id = sample(1:5, 1096, replace = T),
id.sub = sample(letters[1:3], 1096, replace = T),
val = rnorm(1096))
다음과 같이 보입니다.
mydate id id.sub val
1: 2009-01-01 4 c -0.2712793
2: 2009-01-02 5 b 1.8967819
3: 2009-01-03 3 b 1.0168226
4: 2009-01-04 5 a 0.8324829
5: 2009-01-05 1 a -1.8251198
---
1092: 2011-12-28 4 c -1.2794301
1093: 2011-12-29 2 a 0.1221805
1094: 2011-12-30 2 c -1.2370464
1095: 2011-12-31 3 c 2.2440864
1096: 2012-01-01 2 a 1.1407802
이제 id.sub가 "b"와 같으면 각 ID와 매주의 최대 날짜와 val 평균을 계산하고 싶습니다. 내가 얼마나 멀리 왔는지 :
dt[,
.(max.date = max(mydate),
mean.val = mean(.SD[id.sub == "b", val])),
by = list(id, wk = format(mydate, "%Y-%V"))]
그러나 다음과 같은 오류로 인해 벽에 머리를 부딪 히게됩니다.
Error in `[.data.table`(dt, , .(max.date = max(mydate, na.rm = T), mean = sum(.SD[id.sub == :
object 'mydate' not found
"mean.val"줄 또는 "max.date"줄을 제거하면 코드가 작동하지만 함께 모이면 제대로 실행되지 않습니다. 나는 그것이 어떻게 잘못되었는지 전혀 모른다. 누구든지 나를 도울 수 있습니까? 감사합니다.
내 data.table 버전은 v1.9.5입니다.
당신이 찾고 있었던 것 같아요 mean.val = mean(val[id.sub == "b"])
. 이것은 하위 집합을 작성하는보다 표준적인 방법입니다. 주 .()
에 대한 별칭 list()
도 사용할 수 있습니다 by
.
dt[, .(
max.date = max(mydate),
mean.val = mean(val[id.sub == "b"])),
by = .(id, wk = format(mydate, "%Y-%V"))
]
# id wk max.date mean.val
# 1: 5 2009-01 2009-01-04 1.9335678
# 2: 2 2009-01 2009-01-03 NaN
# 3: 4 2009-02 2009-01-10 0.1603871
# 4: 3 2009-02 2009-01-11 NaN
# 5: 1 2009-02 2009-01-08 NaN
# ---
# 619: 3 2011-51 2011-12-24 NaN
# 620: 1 2011-52 2011-12-28 NaN
# 621: 4 2011-52 2011-12-29 -0.8534370
# 622: 2 2011-52 2011-12-31 -1.2628962
# 623: 3 2012-52 2012-01-01 -1.7779465
그룹화 된 모든 열을 살펴보면 시도가 작동하지 않은 이유를 알 수 있습니다.
names(dt[, .SD, by = .(id, wk = format(mydate, "%Y-%V"))])
# [1] "id" "wk" "id.sub" "val"
보시다시피 mydate
더 이상 존재하지 않습니다. 그 이유에 대한 기술적 설명을 제공 할 수 있을지 확신 할 수 없기 때문에 여기서 멈추겠습니다. akrun이 언급했듯이 수정 되었기 때문입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다