我有一个数据框:
df1<-data.frame(1:3,4:6,7:9)
我想将它的每一行附加到同一数据帧的每一行,所以我得到这个:
result<-data.frame(c("1 1","1 2","1 3","2 1","2 2","2 3","3 1","3 2","3 3"),c("4 4","4 5","4 6","5 4","5 5","5 6","6 4","6 5","6 6"),c("7 7","7 8","7 9","8 7","8 8","8 9","9 7","9 8","9 9"))
每个单元格中的每个元素都会成对附加到同一列的其他元素。
我尝试了不同的“粘贴”组合,但没有得到我想要的。我测试的一种可能的解决方案如下:
fpaste <- function(x){mapply(paste, x, df1)}
result_exp <- apply(t(df1), 1, fpaste)
但这不起作用。我正在寻找一个“基本”解决方案,并试图避免将软件包作为“dplyr”。预先感谢您的帮助。
使用
expand.grid
:
sapply(list(1:3, 4:6, 7:9), \(x) do.call(paste, expand.grid(x, x)))
# [,1] [,2] [,3]
# [1,] "1 1" "4 4" "7 7"
# [2,] "2 1" "5 4" "8 7"
# [3,] "3 1" "6 4" "9 7"
# [4,] "1 2" "4 5" "7 8"
# [5,] "2 2" "5 5" "8 8"
# [6,] "3 2" "6 5" "9 8"
# [7,] "1 3" "4 6" "7 9"
# [8,] "2 3" "5 6" "8 9"
# [9,] "3 3" "6 6" "9 9"
不确定行顺序是否重要,但您也可以使用
outer
:
sapply(df1, \(x) outer(x, x, FUN = paste))
# X1.3 X4.6 X7.9
# [1,] "1 1" "4 4" "7 7"
# [2,] "2 1" "5 4" "8 7"
# [3,] "3 1" "6 4" "9 7"
# [4,] "1 2" "4 5" "7 8"
# [5,] "2 2" "5 5" "8 8"
# [6,] "3 2" "6 5" "9 8"
# [7,] "1 3" "4 6" "7 9"
# [8,] "2 3" "5 6" "8 9"
# [9,] "3 3" "6 6" "9 9"