在保留 ID 的同时将数据框的一列转置为多行
Transpose one column of a data frame into multiple rows while retaining ID
我正在处理一个大型现有数据框,其中有一列我需要 "transpose" 到多行,同时在每行中保留原始用户 ID。
请注意,favs 列的内容实际上是一个包含 "c( ... )" 的字符串。此处显示了简化版本:
**uId** **favs**
1000 c('pizza')
1001 c('seafood','steaks')
1002 NA
1003 c('sushi','strawberries')
我想要的输出:
**uId** **favs**
1000 pizza
1001 seafood
1001 steaks
1002 NA
1003 sushi
1003 strawberries
最有效的方法是什么?我考虑过 melt/dcast 但不确定如何在此处应用它,因为 FAVS 列需要不公开,然后将包含不同数量的元素。
我们可以用unnest
library(tidyr)
unnest(df1)
# uID favs
#1 1000 pizza
#2 1001 seafood
#3 1001 steaks
#4 1002 <NA>
#5 1003 sushi
#6 1003 strawberries
或使用 base R
,使用 'favs' 列的 lengths
和 unlist
复制其他列行 'favs'
data.frame(uID = rep(df1$uID, lengths(df1$favs)), favs = unlist(df1$favs))
这可能很快,因为 rep
和 unlist
都很快
数据
df1 <- data.frame(uID = 1000:1003,
favs = I(list('pizza', c('seafood', 'steaks'), NA,
c('sushi', 'strawberries'))))
我正在处理一个大型现有数据框,其中有一列我需要 "transpose" 到多行,同时在每行中保留原始用户 ID。
请注意,favs 列的内容实际上是一个包含 "c( ... )" 的字符串。此处显示了简化版本:
**uId** **favs**
1000 c('pizza')
1001 c('seafood','steaks')
1002 NA
1003 c('sushi','strawberries')
我想要的输出:
**uId** **favs**
1000 pizza
1001 seafood
1001 steaks
1002 NA
1003 sushi
1003 strawberries
最有效的方法是什么?我考虑过 melt/dcast 但不确定如何在此处应用它,因为 FAVS 列需要不公开,然后将包含不同数量的元素。
我们可以用unnest
library(tidyr)
unnest(df1)
# uID favs
#1 1000 pizza
#2 1001 seafood
#3 1001 steaks
#4 1002 <NA>
#5 1003 sushi
#6 1003 strawberries
或使用 base R
,使用 'favs' 列的 lengths
和 unlist
复制其他列行 'favs'
data.frame(uID = rep(df1$uID, lengths(df1$favs)), favs = unlist(df1$favs))
这可能很快,因为 rep
和 unlist
都很快
数据
df1 <- data.frame(uID = 1000:1003,
favs = I(list('pizza', c('seafood', 'steaks'), NA,
c('sushi', 'strawberries'))))