首页 > 解决方案 > 将数据框的一列转置为多行,同时保留 ID

问题描述

我正在处理一个现有的大型数据框,该数据框有一列需要“转置”为多行,同时在每一行中保留原始用户 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 列需要不列出,然后将包含不同数量的元素。

标签: rdataframetranspose

解决方案


我们可以用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

或者,使用'favs' 列和'favs'base R复制其他列行lengthsunlist

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'))))

推荐阅读