我需要处理在受密码保护的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)
“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> \nRun Code Online (Sandbox Code Playgroud)\n\n(数据表是更好的数据框架。)
\n\n函数“f”执行两项工作:“取消列表”并将 NULL 转换为 NA。
\n