R 将数据帧列合并到向量中

R 将数据帧列合并到向量中,r,vector,R,Vector,我想知道是否有更好的方法可以在不使用字符串拆分的情况下产生以下结果: library('magrittr') combn(5, 2) %>% t %>% as.data.frame %>% mutate( string = paste(V1, V2, sep = ';') , vector = string %>% strsplit(split = ';') ) %>% View 我尝试了以下代码,但无效: comb

我想知道是否有更好的方法可以在不使用字符串拆分的情况下产生以下结果:

library('magrittr')
combn(5, 2) %>% 
  t %>% 
  as.data.frame %>% 
  mutate(
      string = paste(V1, V2, sep = ';')
    , vector = string %>% strsplit(split = ';')
    ) %>% View

我尝试了以下代码,但无效:

combn(5, 2) %>% 
  t %>% 
  as.data.frame %>% 
  mutate(
      string = paste(V1, V2, sep = ';')
    , vector = c(V1, V2)
    ) %>% View

谢谢您的帮助。

我们可以有一个
列表
专栏。如果我们在
combn
中指定
simplify=FALSE
,它将返回向量的
list
,可以将其包装在
tibble
中以创建
list

combn(5, 2, simplify = FALSE) %>% 
      tibble(vector = .)

或者另一种选择是使用
unnest\u wide
unite

library(tidyr)
library(dplyr)
library(stringr)
combn(5, 2, simplify = FALSE) %>% 
    tibble(vector = ., vector2 = vector) %>% 
    unnest_wider(c(vector2), names_repair =
      ~ c('vector', str_c('V', 1:2))) %>% 
    unite(string, V1, V2, sep=";", remove = FALSE)

如果我们使用OP的方法,一个选项是
map2
,它在元素连接两列之后返回一个
列表

library(purrr)
combn(5, 2) %>% 
  t %>% 
  as.data.frame %>% 
  mutate(
  string = paste(V1, V2, sep = ';'),
  vector =  map2(V1, V2, c))
#  V1 V2 string vector
#1   1  2    1;2   1, 2
#2   1  3    1;3   1, 3
#3   1  4    1;4   1, 4
#4   1  5    1;5   1, 5
#5   2  3    2;3   2, 3
#6   2  4    2;4   2, 4
#7   2  5    2;5   2, 5
#8   3  4    3;4   3, 4
#9   3  5    3;5   3, 5
#10  4  5    4;5   4, 5

您可以在相同的
combn
函数中执行此操作,方法是将一个函数传递给它,用所需的所有值构造一个数据帧,并将它们组合成一个数据帧

do.call(rbind, combn(5, 2, function(x) {
  df <- data.frame(V1 = x[1], V2 = x[2], string = paste(x, collapse = ";"))
  df$vector <- list(x)
  df
}, simplify = FALSE))

#   V1 V2 string vector
#1   1  2    1;2   1, 2
#2   1  3    1;3   1, 3
#3   1  4    1;4   1, 4
#4   1  5    1;5   1, 5
#5   2  3    2;3   2, 3
#6   2  4    2;4   2, 4
#7   2  5    2;5   2, 5
#8   3  4    3;4   3, 4
#9   3  5    3;5   3, 5
#10  4  5    4;5   4, 5
do.call(rbind,combn)(5,2,function(x){
df