R将列表列表转换为dataframe

Jen*_*enB 6 r list dataframe

我需要处理在受密码保护的Excel(xlsx)工作簿中提供的数据.出于法律原因,我无法从那里创建未受保护的Excel文件或csv文件等.所有Excel导入包都不能处理受密码保护的工作簿.

从这个答案导入密码保护的xlsx工作簿到R我已设法提取数据.但是,它是以字符列表格式列表导入的.我的列表的输入看起来像这样:

list(list("ID", "ID1", "ID2"),
     list("V2", NULL, "text2"),
     list("Name", "John Smith", "Mary Brown"),
     list("Score", 1, 2),
     list("email", "JS@gmail.com", "MB@gov.uk"))
Run Code Online (Sandbox Code Playgroud)

我想要的是具有列ID,V2等的数据帧,如下所示:

   ID    V2     Name        Score  email
   ID1   NULL   John Smith  1      JS@gmail.com
   ID2   text2  Mary Brown  2      MS@gov.uk
Run Code Online (Sandbox Code Playgroud)

原始Excel工作簿中有空单元格,因此使用unlist的解决方案将不起作用.

使用从R列表到数据框和其他类似问题的答案组合,我有以下代码(其中listform是列表的名称):

matform <- as.matrix(sapply(listform, function(s) s)) # retains empty
df <- data.frame(matform[2:nrow(matform),])
names(df) = matform[1,]
Run Code Online (Sandbox Code Playgroud)

这很接近,但数据框列出了列.因此,str(df)收益率:

'data.frame':   2 obs. of  5 variables:
 $ ID:List of 2
  ..$ : chr "ID1"
  ..$ : chr "ID2"
 $ V2:List of 2
  ..$ : NULL
  ..$ : chr "text2"
and so on
Run Code Online (Sandbox Code Playgroud)

mra*_*a68 3

“data.table”包中的“SetDT”似乎非常强大:

\n\n
> library(data.table)\n\n> null2na <- function(x){ ifelse(is.null(x),NA,x)}\n\n> f <- function(x){sapply(x,null2na)}\n\n> L <- list(list("ID", "ID1", "ID2"),\n+           list("V2", NULL, "text2"),\n+           list("Name", "John Smith", "Mary Brown"),\n+           list("S ..." ... [TRUNCATED] \n\n> L <- setDT(L)[, lapply(.SD, f)]\n\n> setnames(L,colnames(L),unlist(L[1,]))\n\n> L <- L[-1,]\n\n> L\n    ID    V2       Name Score        email\n1: ID1    NA John Smith     1 JS@gmail.com\n2: ID2 text2 Mary Brown     2    MB@gov.uk\n\n> str(L)\nClasses \xe2\x80\x98data.table\xe2\x80\x99 and \'data.frame\':  2 obs. of  5 variables:\n $ ID   : chr  "ID1" "ID2"\n $ V2   : chr  NA "text2"\n $ Name : chr  "John Smith" "Mary Brown"\n $ Score: chr  "1" "2"\n $ email: chr  "JS@gmail.com" "MB@gov.uk"\n - attr(*, ".internal.selfref")=<externalptr> \n> \n
Run Code Online (Sandbox Code Playgroud)\n\n

(数据表是更好的数据框架。)

\n\n

函数“f”执行两项工作:“取消列表”并将 NULL 转换为 NA。

\n