使用列表列标准化数据框

时间:2014-03-02 13:39:28

标签: r dataframe reshape

我有一个数据框,可以将某些ID映射到列表版本:

id versions
 1  1, 2, 4
 2        1
 3     3, 4

可以使用以下代码创建:

df <- data.frame(id=c(1, 2, 3), 
  versions=c("1 2 4", "1", "3 4"), 
  stringsAsFactors=F)
df$versions <- strsplit(df$versions, " ")

请注意versions列的每个元素都是一个列表。

如何规范化此数据框?我需要得到一个这样的数据框:

id version
 1       1
 1       2
 1       4
 2       1
 3       3
 3       4

2 个答案:

答案 0 :(得分:4)

stack将是完美的:

stack(setNames(df$versions, df$id))
#   values ind
# 1      1   1
# 2      2   1
# 3      4   1
# 4      1   2
# 5      3   3
# 6      4   3

答案 1 :(得分:1)

我改编并简化了another SO question的解决方案,以供将来参考:

data.frame(id = rep(df$id, sapply(df$versions, length)),
      version = unlist(df$versions))

通过根据每个id具有的版本数(即列表id的长度)重复每个id来计算新的versions列。新的version列是使用unlist计算的,它只是通过连接列表中的所有元素来返回一个向量。