取消列出数据框中的所有列表元素

2023-11-24

我有一个数据框,每列包含以下变量类别:

"date" "numeric" "numeric" "list" "list" "numeric"

每行的数据如下所示:

    1978-01-01, 12.5, 6.3, c(0,0,0.25,0.45,0.3), c(0,0,0,0.1,0.9), 72

我想将其转换为矩阵或数据框,每列一个值,因此结果应如下所示:

1978-01-01, 12.5, 6.3, 0, 0, 0.25, 0.45, 0.3, 0, 0, 0, 0.1, 0.9, 72

我尝试过使用:

j<-unlist(input)
output<-matrix(j,nrow=nrow(input),ncol=length(j)/nrow(input))

但它打乱了输出中行的顺序。

任何想法?

附加信息:

上面的例子稍微简化了dput(head(input))返回以下示例:

structure(list(DATE = structure(c(2924, 2925, 2926, 2927, 2928, 
2929), class = "Date"), TEMP_MEAN_M0 = c(-7.625, -7.375, -6, 
-5.5, -7.625, -9.625), SLP_MEAN_M0 = c(1012.125, 991.975, 989.825, 
986.675, 988.95, 993.075), WIND_DIR_RF_M0 = structure(list(`2.counts` = c(0, 
0.625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.125, 0, 0, 0, 0.125), `3.counts` = c(0.75, 
0.25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `4.counts` = c(0.375, 
0.125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.125, 0.125, 0, 0, 0), `5.counts` = c(0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.125, 
0, 0, 0.125, 0.375, 0.25, 0, 0, 0, 0, 0, 0, 0, 0, 0), `6.counts` = c(0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.125, 
0, 0.25, 0.125, 0.25, 0.25, 0, 0, 0, 0, 0, 0, 0, 0, 0), `7.counts` = c(0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0.125, 0.5, 0.375, 0, 0, 0, 0, 0, 0, 0, 0, 0)), .Names = c("2.counts", 
"3.counts", "4.counts", "5.counts", "6.counts", "7.counts")), 
    CEIL_HGT_RF_M0 = structure(list(`2.counts` = c(0.625, 0, 
    0, 0, 0, 0, 0, 0, 0, 0.375), `3.counts` = c(0.75, 0.125, 
    0, 0.125, 0, 0, 0, 0, 0, 0), `4.counts` = c(0.25, 0.125, 
    0, 0.125, 0, 0, 0, 0, 0.25, 0.25), `5.counts` = c(0, 0, 0, 
    0, 0, 0, 0, 0, 0.125, 0.875), `6.counts` = c(0, 0, 0, 0, 
    0, 0, 0, 0, 0, 1), `7.counts` = c(0, 0, 0, 0, 0, 0, 0, 0, 
    0, 1)), .Names = c("2.counts", "3.counts", "4.counts", "5.counts", 
    "6.counts", "7.counts")), WIND_SPD_MEAN_M0 = c(12.8125, 18.7375, 
    6.175, 8.175, 10.5375, 16.5375)), .Names = c("DATE", "TEMP_MEAN_M0", 
"SLP_MEAN_M0", "WIND_DIR_RF_M0", "CEIL_HGT_RF_M0", "WIND_SPD_MEAN_M0"
), row.names = c(NA, 6L), class = "data.frame")

这有点混乱,而且可能效率很低,但应该可以帮助您入门:

这是一些示例数据:

mydf <- data.frame(Date = as.Date(c("1978-01-01", "1978-01-02")),
                   V1 = c(10, 10),
                   V2 = c(11, 11))
mydf$V3 <- list(c(1:10),
                c(11:20))
mydf$V4 <- list(c(21:25),
                c(26:30))
mydf
#         Date V1 V2                                     V3                 V4
# 1 1978-01-01 10 11          1, 2, 3, 4, 5, 6, 7, 8, 9, 10 21, 22, 23, 24, 25
# 2 1978-01-02 10 11 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 26, 27, 28, 29, 30

并且,有一个小函数可以检查哪些列是列表,对于这些列,rbind让他们在一起,最终cbind将它们与以下列一起使用not lists.

myFun <- function(data) {
  temp1 <- sapply(data, is.list)
  temp2 <- do.call(
    cbind, lapply(data[temp1], function(x) 
      data.frame(do.call(rbind, x), check.names=FALSE)))
  cbind(data[!temp1], temp2)
}

myFun(mydf)
#         Date V1 V2 V3.1 V3.2 V3.3 V3.4 V3.5 V3.6 V3.7 V3.8 V3.9 V3.10 V4.1
# 1 1978-01-01 10 11    1    2    3    4    5    6    7    8    9    10   21
# 2 1978-01-02 10 11   11   12   13   14   15   16   17   18   19    20   26
#   V4.2 V4.3 V4.4 V4.5
# 1   22   23   24   25
# 2   27   28   29   30

仅当每个“列”列表包含相同长度的向量(否则基 R 的rbind不管用)。


Update

半天后重温这个问题,我看到另一个用户(@用户1981275)发布了一个更直接的解决方案,但随后删除了他们的答案。也许他们删除是因为他们的方法将日期转换为整数,因为正如 DWin 指出的那样,矩阵中的项目必须都是相同的模式。

这是他们的解决方案:

t(apply(mydf, 1, unlist))
#      Date V1 V2 V31 V32 V33 V34 V35 V36 V37 V38 V39 V310 V41 V42 V43 V44 V45
# [1,] 2922 10 11   1   2   3   4   5   6   7   8   9   10  21  22  23  24  25
# [2,] 2923 10 11  11  12  13  14  15  16  17  18  19   20  26  27  28  29  30

以下是如何轻松修改它以获得所需的输出。这肯定会比之前的方法更快:

cbind(mydf[!sapply(mydf, is.list)], 
      (t(apply(mydf[sapply(mydf, is.list)], 1, unlist))))
#         Date V1 V2 V31 V32 V33 V34 V35 V36 V37 V38 V39 V310 V41 V42 V43 V44 V45
# 1 1978-01-01 10 11   1   2   3   4   5   6   7   8   9   10  21  22  23  24  25
# 2 1978-01-02 10 11  11  12  13  14  15  16  17  18  19   20  26  27  28  29  30

或者,作为用户函数:

myFun <- function(data) {
  ListCols <- sapply(data, is.list)
  cbind(data[!ListCols], t(apply(data[ListCols], 1, unlist)))
}
myFun(mydf)

Update 2

我还编写了一个更有效的函数,称为col_flatten这是我的“SOfun”套餐的一部分。

使用以下命令安装包:

source("http://news.mrdwab.com/install_github.R")
install_github("mrdwab/SOfun")

然后,你可以这样做:

library(SOfun)
col_flatten(mydf, names(which(sapply(mydf, is.list))), drop = TRUE)
##          Date V1 V2 V3_1 V3_2 V3_3 V3_4 V3_5 V3_6 V3_7 V3_8 V3_9 V3_10 V4_1 V4_2 V4_3 V4_4 V4_5
## 1: 1978-01-01 10 11    1    2    3    4    5    6    7    8    9    10   21   22   23   24   25
## 2: 1978-01-02 10 11   11   12   13   14   15   16   17   18   19    20   26   27   28   29   30

它基于transpose函数在“data.table”中,因此请确保您也有“data.table”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

取消列出数据框中的所有列表元素 的相关文章

随机推荐

  • 如何确保提交到 ThreadPoolExecutor 然后取消的 FutureTask 的垃圾回收?

    我正在提交Callable对象到ThreadPoolExecutor他们似乎一直留在记忆中 使用 Eclipse 的 MAT 工具查看堆转储 可以看到Callable对象正在被引用FutureTask Sync s callable多变的
  • eclipse中“JUnit插件测试”和“JUnit测试”之间的区别

    在eclipse运行命令中 有两种选择 JUnit Plug in Test and JUnit Test 之前 我尝试启动 eclipse 插件测试 org eclipse jdt ui tests refactoring 我遇到了一些问
  • 如何使用 C++ 在 Windows 中复制和粘贴文件?

    我已经用谷歌搜索过这个 但我仍然对如何使用它感到困惑 我正在制作一个文件管理器 我希望能够将文件复制并粘贴到新目录中 我知道要复制我需要使用file copy 但我不确定如何将其实现到我的代码中 我想使用 fstream 来做到这一点 如果
  • 缓存生成器

    最近的一个类似问题 isinstance foo types GeneratorType 还是inspect isgenerator foo 让我好奇如何一般地实现这一点 实际上 拥有一个生成器类型的对象似乎是一个普遍有用的东西 它将在第一
  • D3树:用线代替对角线投影

    我正在使用 d3 js 创建一棵树这个例子 这可以完美地处理我拥有的数据并产生期望的结果 除了一个细节 我不想要那些wiggly节点之间的连接线 我想要一条干净简单的线 谁能告诉我如何制作它 我一直在查看 d3 js 的 API 文档 但没
  • WPF WebBrowser 浏览器版本

    WPF WebBrowser 控件是否取决于用户计算机上安装的 IE 版本 或者它是否使用跨计算机一致的单独库 我读到它只能在 IE7 模式下呈现 但我想确保没有安装 IE 或由于某种原因仍在 IE6 上的用户不会出现任何问题 The MS
  • 点击 MKAnnotation 来“选择”它真的很慢

    在点击 MKMapView 上的注释和显示标注之间有近 0 5 秒的延迟 有谁知道为什么会出现这种情况 以及当用户点击地图时如何使其立即响应 即使用户位置注释在点击时在标注中显示 当前位置 也会发生这种情况 我希望它在点击时立即显示 没有奇
  • 找到重叠的圆圈

    我有一个矩形区域 其中有半径相等的圆 我想找到哪些圆与其他圆重叠 输出是重叠圆的 2 元素集的列表 我知道如何检查两个圆是否重叠 它们的中心之间的距离小于直径 我可以对每对圆圈执行此检查 但我想知道是否有更好的算法 比O n 2 EDIT
  • 用于 iOS 开发的 Objective-C++

    是否可以使用 Objective C 进行 iOS 应用程序 iPhone iPad iPod touch 开发 网上有例子和源代码吗 使用 ObjC 非常简单 您必须声明扩展名为 mm 的源文件 它将使编译器将它们视为 ObjC 与标头相
  • 在Eclipse中用subversion填充@version标签

    我想在 Eclipse 中使用 Subclipse 或 Subversion 填充注释标签 version CVS 会自动完成此操作 但 Subversion 不会 这会很有帮助 我尝试用谷歌搜索 version 但似乎不可能 CVS 所做
  • Puppeteer:如何单击元素以便在新选项卡中打开?

    我有一个包含 25 个可点击元素的列表 我需要在新选项卡中打开它们中的每一个 抓取在新选项卡中打开的新页面 然后将其关闭 然后转到下一个元素 并对列表中的每个元素执行相同的操作 但是 我在通过单击链接在新选项卡中打开链接时遇到问题 然后我设
  • 验证 mongoose 中父级范围内嵌入文档的唯一性

    我在猫鼬中有以下架构 UserSchema new Schema username type String required true GameSchema new Schema identifier String users UserSc
  • 是否可以防止从网站下载视频

    是否可以防止网站上的视频被下载 虽然用户可以使用某些硬件设备录制视频 但不可能使用某些链接下载视频 就像谷歌视频一样 例如 如果我的系统中有 Real One Player 我可以选择下载视频 这应该受到限制 是的 永远不要向任何人展示它
  • 核心数据实体继承 --> 限制?

    我想我会把这个发布到社区 我正在使用 coredata 并且有两个实体 两个实体都具有层级关系 我现在注意到有很多重复的功能 并且想知道是否应该重新构建一个抽象的基本实体 HierarchicalObject 并让我的实体继承它们 所以问题
  • JavaScript 中的三元运算符具有多个表达式?

    the styles the styles appendTo head the styles null the styles stylesheet detach 显然 这是无效的 注意 在 之间appendTo and the styles
  • python:获取长度为N的空格字符串的最简单方法

    在Python中生成长度为N的空格字符串的最简单方法是什么 除了像这样的东西 它是多行的 并且对于大 n 来说可能效率低下 def spaces n s for i in range n s return s 试试这个 简单 只有一行 n
  • 对角线使用 putText() ?使用 OpenCV

    是否可以使用 putText 方法在图片上对角线绘制文本 如果没有 除了使用 addWeighted 将两张图片混合在一起 其中一张是对角放置的文本 之外 还有其他选择吗 我正在尝试在图片上放置文本水印 我的问题是现在我正在使用 addWe
  • 理解 jq JOIN()

    我试图理解JOIN 内置于jq 来自 jq 手册 https stedolan github io jq manual JOIN idx stream idx expr join expr This builtin joins the va
  • 如何处理`Reader` monad 和`Try`?

    我正在读这篇关于使用 Reader monad 在 scala 中进行依赖注入 原始示例运行良好 但我对返回类型做了一些更改UserRepository get find 它是User 但我把它改成了Try User 然后代码就无法编译 我
  • 取消列出数据框中的所有列表元素

    我有一个数据框 每列包含以下变量类别 date numeric numeric list list numeric 每行的数据如下所示 1978 01 01 12 5 6 3 c 0 0 0 25 0 45 0 3 c 0 0 0 0 1