2014-12-27 42 views
2

我有在某列一個項目列表對象下列數據表:訪問列表成員在數據表中

require(data.table) 
col <- c(list(c("A", "B", "C", "D", "E")), 
     list(c("A", "B", "E", "F")), 
     list(c("B", "C", "D", "E"))) 
dt <- data.table(a = c("Jon", "Josh", "Laura"), b = col, c = c(1, 2, 3)) 

我想什麼做的是一列添加到plainstringdt其中包含「b」列中的字符串。我試過

dt[, plainstring := b[.I][[1]]] 

但這不起作用(我猜是誤解了.I)。有任何想法嗎?

所需的輸出將是

> dt 
     a   b c plainstring 
1: Jon A,B,C,D,E 1 A,B,C,D,E 
2: Josh A,B,E,F 2  A,B,E,F 
3: Laura B,C,D,E 3  B,C,D,E 

其中對於每一行idt$plainstring[i]是一個字符矢量和等於unlist(dt$b[i])

+0

如果它是每個列表項'DT [,plainstring的第一個元素:=不公開(lapply(B,'[',1))]'或' dt [,plainstring:= unlist(b)[1],by = c]' – akrun 2014-12-27 17:00:48

+0

@AnandaMahto,謝謝,添加它。這說明了嗎? – johnl 2014-12-27 17:08:29

+0

'dt [,plainstring:= toString(unlist(b)),by = c]' – akrun 2014-12-27 17:09:16

回答

3

從您的更新,它看起來像你想是這樣的:

dt[, plainstring := vapply(b, toString, "")][] 
#  a   b c plainstring 
# 1: Jon A,B,C,D,E 1 A, B, C, D, E 
# 2: Josh A,B,E,F 2 A, B, E, F 
# 3: Laura B,C,D,E 3 B, C, D, E 

從而降低了b列的長度三個字符的載體。

dt[, plainstring] 
# [1] "A, B, C, D, E" "A, B, E, F" "B, C, D, E" 

如果你想它不含空格,然後paste()將在上述vapply()通話更合適。

vapply(b, paste, "", collapse = ",") 
+0

謝謝! – johnl 2014-12-27 17:19:06

2

你可以做

dt[,plainstring:=toString(b[[1L]]),by=1:nrow(dt)] 

    dt 
    #  a   b c plainstring 
    #1: Jon A,B,C,D,E 1 A, B, C, D, E 
    #2: Josh A,B,E,F 2 A, B, E, F 
    #3: Laura B,C,D,E 3 B, C, D, E 

    dt$plainstring 
    #[1] "A, B, C, D, E" "A, B, E, F" "B, C, D, E" 
+1

@Arun感謝您的評論 – akrun 2014-12-27 17:25:28