2014-12-27 39 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