我有以下数据表,其中某列中包含一项列表对象:
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
每行i
,dt$plainstring[i]
是一个字符向量,等于unlist(dt$b[i])
。
答案 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"