Как мне сослаться на столбец в lapply, который не является частью SD?

В моем data.table есть столбец, содержащий данные, которые я хотел бы использовать для обновления группы других столбцов. Эти данные являются списком, и мне нужно составить список на основе значения в каждом из столбцов, которые я включу в свое выражение SD

Мои данные ....

dt <- data.table( A = list( c("X","Y") , c("J","K") ) , B = c(1,2) , C = c(2,1) )
#     A B C
#1: X,Y 1 2
#2: J,K 2 1

Мой желаемый результат ....

#     A B C
#1: X,Y X Y
#2: J,K K J

Что я пытался ....

# Column A is not included in SD so not found...
dt[ , lapply( .SD , function(x) A[x] ) , .SDcols = 2:3 ]
#Error in FUN(X[[1L]], ...) : object 'A' not found


# This also does not work. See's all of A as one long vector (look at results for C)
for( i in 2:3 ) dt[ , names(dt)[i] := unlist(A)[ get(names(dt)[i]) ] ]
#     A B C
#1: X,Y X Y
#2: J,K Y X

# I saw this in another answer, but also won't work:
# Basically we add an ID column and use 'by=' to try and solve the problem  above
# Now we get a type mismatch
dt <- data.table( ID = 1:2 , A = list( c("X","Y") , c("J","K") ) , B = c(1,2) , C = c(2,1) , key = "ID" )
for( i in 3:4 ) dt[ , names(dt)[i] := unlist(A)[ get(names(dt)[i]) ] , by = ID ]
#Error in `[.data.table`(dt, , `:=`(names(dt)[i], unlist(A)[get(names(dt)[i])]),  : 
#  Type of RHS ('character') must match LHS ('double'). To check and coerce would impact performance too much for the fastest cases. Either change the type of the target column, or coerce the RHS of := yourself (e.g. by using 1L instead of 1)

Если кому-то интересно, мои реальные данные - это набор SNP и INDELS для разных изолятов, и я пытаюсь сделать это:

# My real data looks more like this:
# In columns V10:V15;
# if '.' in first character then use data from 'Ref' column
# else use integer at first character to subset list in 'Alt' column
#   Contig  Pos V3 Ref Alt    Qual        V10       V11       V12       V13       V14       V15
#1:     1   172  .   T   C 81.0000  1/1:.:.:. ./.:.:.:. ./.:.:.:. ./.:.:.:. ./.:.:.:. ./.:.:.:.
#2:     1   399  .   G C,A 51.0000  ./.:.:.:. 1/1:.:.:. 2/2:.:.:. ./.:.:.:. 1/1:.:.:. ./.:.:.:.
#3:     1   516  .   T   G 57.0000  ./.:.:.:. 1/1:.:.:. ./.:.:.:. 1/1:.:.:. ./.:.:.:. ./.:.:.:.
7 голосов | спросил Simon O'Hanlon 17 J0000006Europe/Moscow 2014, 15:56:45

2 ответа


0

Привет, это работает для тебя?

dt$B <- apply(dt, 1, FUN = function(x) x$A[x$B])
dt$C <- apply(dt, 1, FUN = function(x) x$A[x$C])
dt
#     A B C
#1: X,Y X Y
#2: J,K K J
ответил Victorp 17 J0000006Europe/Moscow 2014, 16:31:14
0

Вероятно, есть более элегантный способ сделать это, и он не очень хорошо масштабируется, но здесь идет ...

dt[,A1:=lapply(A,'[[',1)]
dt[,A2:=lapply(A,'[[',2)]
dt[B==1,`:=`(Bnew=A1,Cnew=A2)]
dt[B==2,`:=`(Bnew=A2,Cnew=A1)]
dt[,`:=`(A1=NULL,A2=NULL,B=NULL,C=NULL)]
setnames(dt,c("Bnew","Cnew"),c("B","C"))
ответил Dean MacGregor 17 J0000006Europe/Moscow 2014, 19:07:27

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132