r - 将列表列表转换为保留名称和所有列的数据框
问题描述
我想将化学公式转换为一个数据框,其中包含 1)矿物名称、2)化学公式和 3)从公式中提取的每个元素的一组列。我得到了前两列,我可以使用 CHNOSZ::makeup() 从每个公式中提取元素的数量。但是,我不熟悉使用列表,并且不确定如何将列表 rbind() 重新放入包含我正在寻找的所有内容的数据框中(即参见上面的 1-3)。
到目前为止,这是我所拥有的-感谢任何帮助(包括指向如何将数据从嵌套列表转换为数据框的好教程的链接)。
library(tidyverse)
library(CHNOSZ)
formulas <- structure(list(Mineral = c("Abelsonite", "Abernathyite", "Abhurite",
"Abswurmbachite", "Acanthite", "Acetamide"), Composition = c("C31H32N4Ni",
"K(UO2)(AsO4)4(H2O)", "Sn3O(OH)2Cl2", "CuMn6(SiO4)O8", "Ag2S",
"CH3CONH2")), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA,
-6L))
test <- formulas %>%
select(Composition) %>%
map(CHNOSZ::makeup) %>%
flatten
test2 <- do.call(rbind,test)
> test2
As H K O U
[1,] 31 32 4 1 31
[2,] 4 2 1 19 1
[3,] 2 2 3 3 2
[4,] 1 6 12 1 1
[5,] 2 1 2 1 2
[6,] 2 5 1 1 2
这是不对的。
解决方案
你可以做这样的事情
library(tidyverse)
library(CNOSZ)
test <- formulas %>%
mutate(res = map(Composition, ~stack(makeup(.x)))) %>%
unnest(cols = res) %>%
spread(ind, values)
## A tibble: 6 x 17
# Mineral Composition C H N Ni As K O U Cl
# <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 Abelso… C31H32N4Ni 31 32 4 1 NA NA NA NA NA
#2 Aberna… K(UO2)(AsO… NA 2 NA NA 4 1 19 1 NA
#3 Abhuri… Sn3O(OH)2C… NA 2 NA NA NA NA 3 NA 2
#4 Abswur… CuMn6(SiO4… NA NA NA NA NA NA 12 NA NA
#5 Acanth… Ag2S NA NA NA NA NA NA NA NA NA
#6 Acetam… CH3CONH2 2 5 1 NA NA NA 1 NA NA
## … with 6 more variables: Sn <dbl>, Cu <dbl>, Mn <dbl>, Si <dbl>, Ag <dbl>,
## S <dbl>
推荐阅读
- java - Spring Security (3.2) BCrypt 不会对登录密码进行哈希处理
- javascript - 使用嵌套单选按钮获取父输入 div 的 ID 以实现可访问性
- javascript - 如何告诉 Excel CSV 的分隔符/分隔符
- python - 在按键上播放随机声音 [Python]
- google-apps-script - 单元格值为真时触发函数的脚本
- nodemailer - Nodemailer 错误:无法使用“in”运算符搜索“contentTransferEncoding”
- c - 如何确保 C 代码(Visual Studio 2013 express + WDK 8.1,WDM 内核驱动程序)中没有浮点运算?
- java - 使用 WindowManager 覆盖页脚
- php - 在登录中注入一个步骤
- angular - 在路由文件上使用多个警卫