내 질문은 참조 대 복사 및 복사와 관련이 data.table
있습니다. 하나의 참조로 행을 삭제할 수 있는지 알고 싶습니다.
DT[ , someCol := NULL]
알고 싶다
DT[someRow := NULL, ]
이 기능이 존재하지 않는 이유는 충분할 것 같습니다. 따라서 아래와 같이 일반적인 복사 방식을 대신 할 수 있습니다. 특히, 내가 좋아하는 예제 (data.table)에서
DT = data.table(x = rep(c("a", "b", "c"), each = 3), y = c(1, 3, 6), v = 1:9)
# x y v
# [1,] a 1 1
# [2,] a 3 2
# [3,] a 6 3
# [4,] b 1 4
# [5,] b 3 5
# [6,] b 6 6
# [7,] c 1 7
# [8,] c 3 8
# [9,] c 6 9
이 data.table에서 첫 번째 행을 삭제하고 싶다고 가정 해보십시오. 나는 이것을 할 수 있다는 것을 안다.
DT <- DT[-1, ]
하지만 종종 우리는 객체를 복사하고 있기 때문에 우리는이를 방지 할 수 있습니다 (N은 경우 즉, 3 * N 메모리에 대한 요구 object.size(DT)
, 여기에서 지적했듯이 지금은 발견했다. set(DT, i, j, value)
내가 어떻게 설정 특정 값으로 (여기처럼 알고있다. 모든 설정 1 행과 2 행, 2 열과 3 열의 값은 0)
set(DT, 1:2, 2:3, 0)
DT
# x y v
# [1,] a 0 0
# [2,] a 0 0
# [3,] a 6 3
# [4,] b 1 4
# [5,] b 3 5
# [6,] b 6 6
# [7,] c 1 7
# [8,] c 3 8
# [9,] c 6 9
그러나 처음 두 행을 어떻게 지울 수 있습니까? 하기
set(DT, 1:2, 1:3, NULL)
전체 DT를 NULL로 설정합니다.
내 SQL 지식은 매우 제한되어 있으므로 data.table에서 SQL 기술을 사용하므로 SQL 명령에 해당하는 것이 있습니까?
DELETE FROM table_name
WHERE some_column=some_value
data.table에?
DT[ , keep := .I > 1]
나중에 작업 집합을, : DT[(keep), ...]
, 아마도 setindex(DT, keep)
이 부분 집합의 속도. 만병 통치약은 아니지만 워크 플로우에서 디자인 선택으로 고려해야 할 가치가 있습니다. 메모리에서 모든 행 을 실제로 삭제 하시겠습니까 , 아니면 제외 하시겠습니까? 답변은 사용 사례에 따라 다릅니다.
data.table()
SQL의 다른 연산과에 대한 다양한 인수 사이에 병렬을 그릴 수있는만큼 SQL 기술 을 사용 한다고 생각하지 않습니다data.table
. 나에게 "기술"에 대한 언급data.table
은 AFAIK가 아닌 어딘가에 SQL 데이터베이스 위에 있다는 것을 암시합니다 .