在R语言中与`bind_cols()`相反的函数是什么?

3

使用 data.frame()tibble()bind_cols() 轻松将向量绑定到数据框中:

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

你真的需要将tibble转换为list吗?也许更好的方法是使用group_map。这个函数期望输入tibble - Marek Fiołka
1个回答

4
我们可以使用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 等。


1
感谢@akrun的传奇响应时间。;) 这个很有效。我通常在我的管道中使用%>% setNames(),这很熟悉。自动setNames会很好。我有点惊讶dplyr没有一个可以完全做到这一点的函数。我现在要检查文档了。https://dplyr.tidyverse.org/reference/index.html - Rich Pauloo
1
实际上,我的示例不是最好的,因为列名不在那里。如果我指定良好的列名(数据框应该有),as.list() 就能很好地工作。我现在会编辑问题。 - Rich Pauloo
1
@RichPauloo 在 pmap 中的 ..1..2 与列名无关,只是因为在创建 tibble 时未命名,导致这里的列名相似。 - akrun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接