访问数据表中的列表成员

时间:2014-12-27 16:55:58

标签: r data.table

我有以下数据表,其中某列中包含一项列表对象:

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))

我想要做的是向plainstring添加一列dt,其中包含来自&#34; b&#34;的字符串。柱。我试过了

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])

2 个答案:

答案 0 :(得分: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 = ",")

答案 1 :(得分: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"