0

我有以下数据框:

# 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  

我想combn在 3 列之间的 tibble 的每一行上运行一个参数为 2 的函数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

但无济于事。

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

感谢您的帮助

4

2 回答 2

1

您可以获得长格式的数据,对于每个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
于 2020-05-31T01:14:53.000 回答
0

这是一个选项,pmap用于遍历每行中的“数字”列,combn通过选择 2 个元素,paste它们与str_corpaste和列一起unnest获得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)))
于 2020-05-30T20:27:29.270 回答