在unlist中更改连接分隔符

时间:2017-10-28 13:21:43

标签: r

我有一个列表要删除。我的问题是有些名称包含.。如何防止取消列表使用.作为分隔符?然后我想使用tstrsplit来构建一个表。

library('data.table')

# without names with a . in the list everything is ok
to_unlist <- list('a1' = list('b' = 1, 'c' = 2), 
                  'a2' = list('b' = 3, 'c' = 4),
                  'a3' = list('b' = 5, 'c' = 6))
to_unlist <- unlist(to_unlist)
table <- data.table(names = names(to_unlist), value = to_unlist)
table[, c('V1', 'V2') := tstrsplit(names, ".", fixed = TRUE)]

# with a name containing a .
to_unlist <- list('a1' = list('b' = 1, 'c' = 2), 
                  'a2' = list('b' = 3, 'c' = 4),
                  'a3' = list('b.d' = 5, 'c' = 6))
to_unlist <- unlist(to_unlist)
table <- data.table(names = names(to_unlist), value = to_unlist)
# This gives an error
table[, c('V1', 'V2') := tstrsplit(names, ".", fixed = TRUE)]
# proper output should be
     names value V1  V2
1:   a1.b     1 a1   b
2:   a1.c     2 a1   c
3:   a2.b     3 a2   b
4:   a2.c     4 a2   c
5: a3.b.d     5 a3 b.d
6:   a3.c     6 a3   c

第5行是问题所在,我希望保留b.d的值,但是因为我在.分开,所以我不能这样做。

如何告诉unlist使用与.不同的分隔符?或者如何在列表中使用.更改名称(我的实际列表来自json字符串,它是一个很长的嵌套列表)

我编辑了这个问题,希望现在更清楚了。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我们可以在使用. _之后将unlist更改为sub,然后在_中将sep指定为tstrsplit

table <- data.table(names = sub("[.]", "_", names(to_unlist)), value = to_unlist)
table[, c('V1', 'V2') := tstrsplit(names, "_", fixed = TRUE)]

或其他选项melt可直接将list转换为data.frame

as.data.table(melt(to_unlist))