2017-11-28 20 views
0

고유 ID에 해당하는 레코드에 여러 데이터 테이블을 서브 세트하려고합니다. 비슷한 스레드는 herehere입니다. 이러한 솔루션은 각 데이터 테이블을 개별적으로 프로그래밍하는 경우 작동하지만 필자가 가지고있는 모든 데이터 테이블에서 코드를 실행하고 싶습니다.여러 데이터 테이블의 행을 제거하고 원본 데이터 테이블에 저장

내 데이터는 다음과 같이 보입니다 :

dt1 <- data.table(var1 = c("A", "B", "C"), var2 = c("...", "...", "..."), id = c("101", "105", "105")) 
dt2 <- data.table(var1 = c("D", "E", "F"), var2 = c("...", "...", "..."), var3 = c("...", "...", "..."), id = c("110", "110", "139")) 
dt3 <- data.table(var1 = c("B", "G", "H"), id = c("105", "113", "113")) 

> dt1 
    var1 var2 id 
1: A ... 101 
2: B ... 105 
3: C ... 105 
> dt2 
    var1 var2 var3 id 
1: D ... ... 110 
2: E ... ... 110 
3: F ... ... 139 
> dt3 
    var1 id 
1: B 105 
2: G 113 
3: H 113 

을 나는 각각의 데이터 테이블이 결국이 될 수 있도록 모든 중복 ID를 제거 할 것 :

> dt1 
    var1 var2 id 
1: A ... 101 
> dt2 
    var1 var2 var3 id 
3: F ... ... 139 
> dt3 
    var1 id 
1: B 105 

내가 성공적으로 각 데이터를 부분 집합 수 테이블을 별도로 dt1 <- dt1[, if(.N==1) .SD, by = id] 등을 사용하여,하지만 대신에 한 번에 각 테이블을 업데이 트하고 싶습니다.

시도했습니다 lapply(list(dt1, dt2, dt3), function(x) x[, if(.N==1) .SD, by = id])하지만 내 환경에서 내 테이블을 업데이트하지 않습니다. 예를 들어 sub <- lapply(list(dt1, dt2, dt3), function(x) x[, if(.N==1) .SD, by = id])을 사용하여 목록에 결과를 저장하면 데이터 표를 dt1 <- as.data.table(sub[1]) 등으로 저장할 수 있지만 피하려고하는 각 데이터 표를 수동으로 코딩합니다. 나는 또한 내 콘솔에서 list()을 반환 한 lapply(names(sub), function(x) {assign(x, value=sub[[x]], envir=globalenv())})을 시도했지만 내가 말할 수있는 한 아무것도 업데이트하지 않았습니다. 을 사용하여 제안 된 here을 사용하면 "names (x)는 (는) x와 동일한 길이의 문자 벡터 여야합니다."라는 오류가 발생했습니다.

원본 데이터 테이블에서 중복 ID 레코드를 동시에 제거하는 방법에 대한 제안 사항이 있습니까?

답변

1

이것은 문제를 해결할 수 있지만 문제가 될 수있는 최선의 방법은 아닙니다. 때때로 우리는 for 루프를 피할 수 없습니다.

y=c("dt1","dt2","dt3") 
for(i in 1:3){ 
    assign(y[i],(get(y[i])[, if(.N==1) .SD, by = id])) 
} 

지금 시도하고 DT1를 호출하고 여기에 나머지

1

duplicated 또 다른 옵션입니다. 우리는 mget을 사용하여 list에있는 객체의 값을 얻은 다음 duplicated을 사용하여 'id가 중복 된 행을 제거합니다. list에 보관하는 것이 더 좋지만 필요한 경우 글로벌 환경의 개체를 list2env

list2env(lapply(mget(paste0("dt", 1:3)), 
    function(x) x[!(duplicated(id)|duplicated(id, fromLast=TRUE))]), .GlobalEnv) 
dt1 
# var1 var2 id 
#1: A ... 101 

dt2 
# var1 var2 var3 id 
#1: F ... ... 139 

dt3 
# var1 id 
#1: B 105 
으로 업데이트하십시오.