separate question earlier today 中,我询问了如何将嵌套列表展平为数据框中的一行。我希望进一步了解如何在数据框中操作我的列表,这次是通过在数据框中垂直扩展列表,添加新行以容纳数据。

在这种情况下,我希望从这个结构出发:

CAT    COUNT            TREAT
A      1,2,3            Treat-a, Treat-b
B      4,5              Treat-c,Treat-d,Treat-e

对于这个结构:
CAT   COUNT  TREAT
A     1      Treat-a
A     2      Treat-b
A     3      NA
B     4      Treat-c
B     5      Treat-d
B     NA     Treat-e

生成测试(源)数据的代码:
df<-data.frame(CAT=c("A","B"))
df$COUNT <-list(1:3,4:5) # as numbers
df$TREAT <-list(paste("Treat-", letters[1:2],sep=""),paste("Treat-", letters[3:5],sep=""))

我尝试以类似于提供给我之前的问题的答案的方法使用 CBIND,但由于多个列表之间的值数量不同而失败。感谢您在我尝试掌握这些基本操作任务时的耐心等待。

最佳答案

这是我想出的,使用辅助函数 cbind.fill: ( cbind a df with an empty df (cbind.fill?) )

cbind.fill <- function(...){
  nm <- list(...)
  nm <- lapply(nm, as.matrix)
  n <- max(sapply(nm, nrow))
  do.call(cbind, lapply(nm, function (x)
    rbind(x, matrix(, n-nrow(x), ncol(x)))))
}

#Split df by CAT
df.split <- split(df, df$CAT)

#Apply cbind.fill to make a matrix filled with NA where needed
rawlist <- lapply(df.split, function(x) cbind(as.character(x$CAT), cbind.fill(unlist(x$COUNT), unlist(x$TREAT) ) ))

#Bind rows and convert matrix to data.frame
df.new <- as.data.frame(do.call(rbind, rawlist))

#Column names
colnames(df.new) <- names(df)

df.new
  CAT COUNT   TREAT
1   A     1 Treat-a
2   A     2 Treat-b
3   A     3    <NA>
4   B     4 Treat-c
5   B     5 Treat-d
6   B  <NA> Treat-e

关于r - 将 R 数据框中的列表扩展到数据框中的其他行中?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34210669/

10-13 07:24
查看更多