运行 数据框不同列上的组合函数,一次一行
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 个元素来获得 combn
,paste
它们与 str_c
或 paste
和 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 R
和 apply
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
我有以下数据框:
# 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 个元素来获得 combn
,paste
它们与 str_c
或 paste
和 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 R
和 apply
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