【问题标题】:opposite of `bind_cols()` in R [duplicate]与R中的`bind_cols()`相反[重复]
【发布时间】:2021-08-29 04:23:40
【问题描述】:

使用data.frame()tibble()bind_cols() 将向量绑定到data.frame 中很简单:

library(tidyverse)
x <- 1:5
y <- letters[1:5]
d <- tibble(x, y)

反转此操作的最有效方法是什么 - 即,获取一个数据帧并将其分解为长度等于 ncol(d) 的列表?在上面的示例中,所需的输出如下所示:

> list(x = x, y = y)

$x
[1] 1 2 3 4 5

$y
[1] "a" "b" "c" "d" "e"

完成此操作的单个函数会很有用,例如,当将数据帧传送到 pmap() 时:

d %>%
  break_into_list() %>% # missing function here
  pmap(function(x, y) paste(x, y)) # scales to dataframe with ncol > 2

【问题讨论】:

  • 您真的需要在list 中转换tibble 吗?也许更好的方法是使用group_map。此函数需要 tibble 作为输入。

标签: r dplyr tidyverse


【解决方案1】:

我们可以使用unclass,它也为“row.names”提供attribute

unclass(d)

或者as.list

as.list(d)

如果名称应为 NULL,请使用 setNames

setNames(as.list(d), NULL)

-输出

[[1]]
[1] 1 2 3 4 5

[[2]]
[1] "a" "b" "c" "d" "e"

关于pmap的使用,我们不需要转换成list。假设我们需要遍历行(pmap 会这样做)

library(dplyr)
library(purrr)
d %>% 
    pmap(~ f(..1, ..2))

其中..1..2 是第一列和第二列,用作函数的输入,f 将应用于每一行。如果有更多列并且函数需要更多输入,请使用..3..4 等。

【讨论】:

  • 感谢@akrun 传奇般的响应时间。 ;) 这行得通。我通常在我的管道中使用%&gt;% setNames(),这很熟悉。有一种自动setNames 的方法会很好。我有点惊讶 dplyr 没有功能来做到这一点。我现在要检查文档。 dplyr.tidyverse.org/reference/index.html
  • 实际上,我的例子并不是最好的,因为 colnames 不存在。如果我指定好的列名(数据框应该有),as.list() 工作得很好。我现在将编辑问题。
  • @RichPauloo ..1..2 中的pmap 与列名无关。只是您的列名在这里相似,即...1...2,因为它在创建小标题时未命名
猜你喜欢
  • 2021-09-17
  • 2012-05-22
  • 1970-01-01
  • 1970-01-01
  • 2011-07-07
  • 2011-11-19
  • 2022-07-07
  • 1970-01-01
  • 2015-04-21
相关资源
最近更新 更多