2016-10-13 6 views
2

에 data.table의 값으로 빈 목록을 추가는 다음과 같이, 내가 R에 data.table이 R

DT <- data.table(c1 = 1:3, 
       c2 = as.list(c("bob",NA,"mary")), 
       c3 = as.list(c(NA,"joe",NA))) 

내가 싶습니다 나중에 열 C2와 C3을 연결하기 때문에 사용, 빈리스트로 NA 값을 대체 :

DT[, combined := list(list(unlist(union(c2,c3)))), by=c1] 

나에게

DT$combined 
    [[1]] bob,NA 
    [[2]] NA,joe 
    [[3]] mary,NA 

을 제공하는 어떻게 우아한 방법으로 작업을 수행하는 내 질문은 어디에서 오는 대신 원하는

DT$combined 
    [[1]] bob 
    [[2]] joe 
    [[3]] mary 

의 난 여기 NAS가 목록을 비워 변환하여 원하는 결과를 얻을 수 있습니다?

내가 데이터 프레임 구문을 사용하여 NAS의 제거 할 수 :

DT$c2[is.na(DT$c2)] <- list(list()) 

을하지만, 나는 데이터 테이블을 사용하고 있기 때문에, 그들은보다 나은해야한다, 나는

같은 것을하고 싶어

Error in set(DT, DT[, .I[is.na(c2)]], "c2", value = list(list())) : 
RHS of assignment to existing column 'c2' is zero length but not NULL. 
If you intend to delete the column use NULL. Otherwise, the RHS must have length > 0; 
e.g., NA_integer_. If you are trying to change the column type to be an empty list column then, 
as with all column type changes, provide a full length RHS vector such as 
vector('list',nrow(DT)); i.e., 'plonk' in the new column. 

난 그냥 더 나은 방법을 찾고 있어요 : R은 다음과 같은 오류를 뱉어되는

set(DT, DT[,.I[is.na(c2)]], "c2", value= list(list())) 

data.tables를 사용합니다.

+0

당신이'c2'와'목록 수 c3'을 하시겠습니까? 당신의 예제에서는 당신은 단지 그들 안에 단일 값을 유지하는 것처럼 보입니다. – eddi

+0

예, 응용 프로그램 코드를 게시하지 않았습니다. 응용 프로그램 코드가 훨씬 복잡하기 때문에 여러 값을 가진 특성 목록입니다. – squishbug

답변

6

추가로 명시 적 NULL 당신의 list(list()) :

DT[is.na(c2), c2 := .(list(NULL))] 

# or loop over the relevant columns 
for (col in c('c2', 'c3')) DT[is.na(get(col)), (col) := .(list(NULL))]