运行 数据框不同列上的组合函数,一次一行

Running a combn function on different columns of a dataframe, one row at a time

我有以下数据框:

# A tibble: 3 x 4
  index number_1 number_2 number_3
  <int> <chr>    <chr>    <chr>   
1     1 32       16       29      
2     2 13       50       47      
3     3 37       19       18  

我想 运行 一个参数为 2 的 combn 函数到 3 列 number 之间该小标题的每一行;这将产生如下结果:

# A tibble: 3 x 2
  index combn
  <dbl> <chr>
1     1 32,16
2     1 32,29
3     1 16,29
4     2 13,50
.............

我想到了

theTibble %>%
               (
               select(., number_1 : nulber_3) %>% lapply(FUN = combn,2)
               ) %>% View

但无济于事。

我想要一个管道友好的解决方案。 可能的解决方案是什么?

感谢您的帮助

这是一个带有 pmap 的选项,用于遍历每行中的 'number' 列,通过选择 2 个元素来获得 combnpaste 它们与 str_cpasteunnest list

library(dplyr)
library(purrr)
library(tidyr)
library(stringr)
df1 %>%
    transmute(index, Combn = pmap(select(., starts_with('number')), ~ 
            combn(c(...), 2, str_c, collapse ="," )))  %>%
    unnest(c(Combn))
# A tibble: 9 x 2
#  index Combn
#  <int> <chr>
#1     1 32,16
#2     1 32,29
#3     1 16,29
#4     2 13,50
#5     2 13,47
#6     2 50,47
#7     3 37,19
#8     3 37,18
#9     3 19,18

gather

df1 %>%
   gather(key, val, -index) %>% 
   group_by(index) %>%
   summarise(combn = list(combn(val, 2, toString))) %>%
   unnest(combn)

或使用 base Rapply

lst1 <- apply(df1[-1], 1, combn, 2, paste, collapse=",", simplify = FALSE)
data.frame(index = rep(df1$index, lengths(lst1)), Combn = unlist(lst1))

数据

df1 <- tibble(index = 1:3, number_1 = as.character(c(32, 13, 37)),
   number_2 = as.character(c(16, 50, 19)), number_3 = as.character(c(29, 47, 18)))

您可以获得长格式的数据,对于每个 index 应用 combn 函数一次选择 2 个值,将它们粘贴到以逗号分隔的字符串 (toString) 中,然后unnest.

library(dplyr)
library(tidyr)

df %>%
  pivot_longer(cols = -index) %>%
  group_by(index) %>%
  summarise(combn = list(combn(value, 2, toString))) %>%
  unnest(combn)

#  index combn 
#  <int> <chr> 
#1     1 32, 16
#2     1 32, 29
#3     1 16, 29
#4     2 13, 50
#5     2 13, 47
#6     2 50, 47
#7     3 37, 19
#8     3 37, 18
#9     3 19, 18