取消列出不同长度的列表

时间:2018-11-20 15:57:08

标签: r dataframe

我收到某种数据的格式是一种数据框,它由两列组成:IDset和elems

第一个是一个整数,第二个是一个包含用逗号分隔的ID的字符串,如以下示例所示:

idset <- c(1111,2222,3333)
elems <- c('1,2,3', '1,3,5,7,9', '4,6')
df <- data.frame(idset, elems, stringsAsFactors = F)

所以df是:

  idset     elems
1  1111     1,2,3
2  2222 1,3,5,7,9
3  3333       4,6

我想要一个数据框(或矩阵或命名列表),其中每列有一个元素(例如“长”表):

   idset elems
1   1111     1
2   1111     2
3   1111     3
4   2222     1
5   2222     2
6   2222     3
7   2222     7
8   2222     9
9   3333     4
10  3333     6

我知道我可以使用一些嵌套循环来做到这一点,但是我想知道是否存在一些方便的功能来为此提供更好的解决方案。

谢谢大家!

1 个答案:

答案 0 :(得分:0)

您可以使用strsplit()lapply()

l <- lapply(1:nrow(df), function(x) strsplit(df$elems, ",")[[x]])
df1 <- data.frame(do.call(
  rbind, lapply(1:length(l), function(x) cbind(df$idset[x], l[[x]]))))
names(df1) <- names(df)

屈服

> df1
   idset elems
1   1111     1
2   1111     2
3   1111     3
4   2222     1
5   2222     3
6   2222     5
7   2222     7
8   2222     9
9   3333     4
10  3333     6

数据

> dput(df)
structure(list(idset = c(1111, 2222, 3333), elems = c("1,2,3", 
"1,3,5,7,9", "4,6")), class = "data.frame", row.names = c(NA, 
-3L))