gpt4 book ai didi

R将列表列表转换为数据框

转载 作者:行者123 更新时间:2023-12-04 14:26:10 27 4
gpt4 key购买 nike

我需要处理受密码保护的 Excel (xlsx) 工作簿中提供的数据。出于法律原因,我无法创建不 protected Excel 文件或 csv 文件等并从那里进行处理。没有一个 Excel 导入包可以处理受密码保护的工作簿。

从这个答案 Import password-protected xlsx workbook into R我已经设法提取数据。但是,它是以字符列表格式的列表导入的。我的列表的 dput 如下所示:

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

我想要的是一个带有列 ID、V2 等的数据框,如下所示:
   ID    V2     Name        Score  email
ID1 NULL John Smith 1 JS@gmail.com
ID2 text2 Mary Brown 2 MS@gov.uk

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

使用来自 R list to data frame 的答案组合和其他类似的问题,我有以下代码(其中 listform 是列表的名称):
matform <- as.matrix(sapply(listform, function(s) s)) # retains empty
df <- data.frame(matform[2:nrow(matform),])
names(df) = matform[1,]

这很接近,但数据框将列表作为列。所以 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

最佳答案

第一步:提取名称:

names = lapply(listform, `[[`, 1)
data = setNames(lapply(listform, `[`, -1), names)

第二步:取消列出数据并绑定(bind)列
result = as.data.frame(sapply(data, unlist))

这里的魔力发生在 sapply , 内部调用 simplify2array . as.data.frame最后需要从结果矩阵中创建一个 data.frame,并将适当的数据类型分配给各个列。

上面的代码有一个问题:列类型可能不是你想要的。这可以修复如下:
col_classes = sapply(lapply(listform, `[[`, 2), typeof)
result = as.data.frame(sapply(data, unlist), stringsAsFactors = FALSE)
for (col in seq_len(ncol(result)))
class(result[[col]]) = col_classes[col]

现在您将得到以下结果:
> str(result)
'data.frame': 2 obs. of 5 variables:
$ ID : chr "ID1" "ID2"
$ V2 : chr "text1" "text2"
$ Name : chr "John Smith" "Mary Brown"
$ Score: num 1 2
$ email: chr "JS@gmail.com" "MB@gov.uk"

我认为,这就是你想要的。

关于R将列表列表转换为数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32117321/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com