R - 由行连接的列字符串的所有成对组合
R - All pairwise combinations of column strings concatenated by the row
如何转换这样的数据框:
X__1 X__2 X__3
<chr> <chr> <chr>
1 a b c
2 d e f
3 g h i
4 j k l
进入这个:
X__1 X__2 X__3
<chr> <chr> <chr>
1 a-d b-e c-f
2 a-g b-h c-i
3 a-j b-k c-l
4 d-g e-h f-i
5 d-j e-k f-l
6 g-j h-k i-l
换句话说,它应该对数据框中的整行进行所有可能的成对组合,组合来自同一列但用符号 (-) 分隔的字符串。它不需要以提及字母的其他顺序重复已经完成的组合,即 "a-d, b-e, c-f" 是必需的,而不是 "d-a, e-b, f-c".
提前谢谢你。如果需要,让我知道如何改进提出问题。
我们可以使用map
library(purrr)
library(stringr)
map_dfc(df1, combn, m = 2, FUN = str_c, collapse="-")
# A tibble: 6 x 3
# X__1 X__2 X__3
# <chr> <chr> <chr>
#1 a-d b-e c-f
#2 a-g b-h c-i
#3 a-j b-k c-l
#4 d-g e-h f-i
#5 d-j e-k f-l
#6 g-j h-k i-l
或使用summarise/unnest
library(dplyr)
library(tidyr)
df1 %>%
summarise(across(everything(), ~
list(combn(., 2, FUN = str_c, collapse="-")))) %>%
unnest(everything())
# A tibble: 6 x 3
# X__1 X__2 X__3
# <chr> <chr> <chr>
#1 a-d b-e c-f
#2 a-g b-h c-i
#3 a-j b-k c-l
#4 d-g e-h f-i
#5 d-j e-k f-l
#6 g-j h-k i-l
或 base R
data.frame(lapply(df1, combn, m = 2, paste, collapse="-"))
# X__1 X__2 X__3
#1 a-d b-e c-f
#2 a-g b-h c-i
#3 a-j b-k c-l
#4 d-g e-h f-i
#5 d-j e-k f-l
#6 g-j h-k i-l
数据
df1 <- structure(list(X__1 = c("a", "d", "g", "j"), X__2 = c("b", "e",
"h", "k"), X__3 = c("c", "f", "i", "l")), class = "data.frame", row.names = c("1",
"2", "3", "4"))
如何转换这样的数据框:
X__1 X__2 X__3
<chr> <chr> <chr>
1 a b c
2 d e f
3 g h i
4 j k l
进入这个:
X__1 X__2 X__3
<chr> <chr> <chr>
1 a-d b-e c-f
2 a-g b-h c-i
3 a-j b-k c-l
4 d-g e-h f-i
5 d-j e-k f-l
6 g-j h-k i-l
换句话说,它应该对数据框中的整行进行所有可能的成对组合,组合来自同一列但用符号 (-) 分隔的字符串。它不需要以提及字母的其他顺序重复已经完成的组合,即 "a-d, b-e, c-f" 是必需的,而不是 "d-a, e-b, f-c".
提前谢谢你。如果需要,让我知道如何改进提出问题。
我们可以使用map
library(purrr)
library(stringr)
map_dfc(df1, combn, m = 2, FUN = str_c, collapse="-")
# A tibble: 6 x 3
# X__1 X__2 X__3
# <chr> <chr> <chr>
#1 a-d b-e c-f
#2 a-g b-h c-i
#3 a-j b-k c-l
#4 d-g e-h f-i
#5 d-j e-k f-l
#6 g-j h-k i-l
或使用summarise/unnest
library(dplyr)
library(tidyr)
df1 %>%
summarise(across(everything(), ~
list(combn(., 2, FUN = str_c, collapse="-")))) %>%
unnest(everything())
# A tibble: 6 x 3
# X__1 X__2 X__3
# <chr> <chr> <chr>
#1 a-d b-e c-f
#2 a-g b-h c-i
#3 a-j b-k c-l
#4 d-g e-h f-i
#5 d-j e-k f-l
#6 g-j h-k i-l
或 base R
data.frame(lapply(df1, combn, m = 2, paste, collapse="-"))
# X__1 X__2 X__3
#1 a-d b-e c-f
#2 a-g b-h c-i
#3 a-j b-k c-l
#4 d-g e-h f-i
#5 d-j e-k f-l
#6 g-j h-k i-l
数据
df1 <- structure(list(X__1 = c("a", "d", "g", "j"), X__2 = c("b", "e",
"h", "k"), X__3 = c("c", "f", "i", "l")), class = "data.frame", row.names = c("1",
"2", "3", "4"))