2014-03-02 83 views
3

我有一些IDS映射到版本的列表數據幀規格化數據幀:與列表列

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 
+0

嗯,很多問同一個問題 – rodrigorgs

回答

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 
+0

不錯!我只是添加'colnames(x)< - c(「version」,「id」);根據問題(假設'x'是'stack()'返回的數據幀),x < - x [,c(「id」,「version」)]'格式化數據框'x'。 – rodrigorgs

1

我適於並從another SO question簡化了溶液以供將來參考:

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

id列由根據數量的重複每個ID計算它的版本(即列表的長度爲versions)。新的version列使用unlist進行計算,該列僅通過連接列表中的所有元素來返回矢量。

+0

大的方式!謝謝! – hhh