arrays - 将数据框中的分隔值拆分为 R 中的多维数组
问题描述
我有一个数据框,其中一些单元格有数字,其他单元格有 NA,而其他单元格有多个用逗号分隔的数字(由于逗号,所有值都是字符类)。我想将具有多个逗号分隔数字的单元格中的值“推送”到一个新层中,但保留它们的列/行位置以创建一个多维数组,每个单元格中只有一个数字,其余的则填充 NA。
示例输入:
col1 col2 col3
row1 814 NA NA
row2 814,9732 7245 4928
row3 NA 4921,8288,4923 NA
期望的输出:
, , 1
[,1] [,2] [,3]
[1,] "814" "NA" "NA"
[2,] "814" "7245" "4928"
[3,] "NA" "4921" "NA"
, , 2
[,1] [,2] [,3]
[1,] "NA" "NA" "NA"
[2,] "9732" "NA" "NA"
[3,] "NA" "8288" "NA"
, , 3
[,1] [,2] [,3]
[1,] "NA" "NA" "NA"
[2,] "NA" "NA" "NA"
[3,] "NA" "4923" "NA"
我已经尝试过使用一个版本,lapply(my.df, function(x) strsplit(x, ","))
但它导致了一个奇怪的数据帧内列表结构,我无法弄清楚如何解析。
解决方案
有趣的问题。我觉得必须有更好的方法来做到这一点,但这有效:
library(abind)
dflist <- lapply(df, strsplit, ',')
maxlen <- max(sapply(dflist, lengths))
out <- lapply(seq_len(maxlen),
function(i) sapply(dflist, function(x) sapply(x, `[`, i)))
do.call(abind, c(out, along = 3))
输出:
, , 1
col1 col2 col3
[1,] "814" NA NA
[2,] "814" "7245" "4928"
[3,] NA "4921" NA
, , 2
col1 col2 col3
[1,] NA NA NA
[2,] "9732" NA NA
[3,] NA "8288" NA
, , 3
col1 col2 col3
[1,] NA NA NA
[2,] NA NA NA
[3,] NA "4923" NA
使用的数据:
df <- fread("
col1 col2 col3
row1 814 NA NA
row2 814,9732 7245 4928
row3 NA 4921,8288,4923 NA
")[, -1, with = F]
df[, col3 := as.character(col3)]
setDF(df)
推荐阅读
- php - 如果用户发送命令,电报机器人会回复一个聊天 ID
- spring-boot - 如何在 docker 中暴露 ${PORT} spring boot 应用程序随机端口?
- tensorflow - 张量流评估()中的损失是什么?是MAE吗?微博?如何将结果与其他回归进行比较?
- javascript - 基于 Com 的 Google App Script 过滤数组
- python - 词干后我能从它的部首中得到一个词吗?
- javascript - 如何使 Chartist.js 上的条形宽度响应
- android - 无限运行计时器直到按下按钮?
- mongodb - MongoDB 模式验证在更新时失败,但没有一次插入
- python - 为什么我的 selenium 浏览器没有登录到 firefox 总是登录的站点?
- javascript - 请求缺少所需的身份验证凭据错误:Firebase 云消息传递