是否有将 Dataframe 组合在一起的功能?

eyh26e7m  于 2023-06-19  发布在  其他
关注(0)|答案(4)|浏览(126)

我尝试将两个数据框组合在一起,这两个数据框具有相同的列名和行名,但每个点的值不同。它们基本上是重复实验。我想按行合并,但也将列分组在一起。
基本上看起来像这样:
Dataframe 1:
| 我不知道|C1| C2| C3|
| - -----|- -----|- -----|- -----|
| r1| 2| 3| 1|
| r2| 0.5| 2| 3|
| r3| 3| 4| 2|
Dataframe 2:
| 我不知道|C1| C2| C3|
| - -----|- -----|- -----|- -----|
| r1| 3| 5个|3|
| r2|六|2| 3|
| r3| 4| 1|七个|
我试图得到一个输出,看起来像这样:
| 我不知道|C1| C1| C2| C2| C3| C3|
| - -----|- -----|- -----|- -----|- -----|- -----|- -----|
| r1| 2| 3| 3| 5个|1| 3|
| r2| 0.5|六|2| 2| 3| 3|
| r3| 3| 4| 4| 1| 2|七个|
我已经试过使用cbind()rbind()merge(),但是两者都给出了不太正确的结果。
rbind(data_1, data_2)给出了接近我想要的输出,但是列没有排序或分组在一起。
从本质上讲,它给出了一个看起来像这样的输出:
| 我不知道|C1| C2| C3| C1| C2| C3|
| - -----|- -----|- -----|- -----|- -----|- -----|- -----|
| r1| 2| 3| 1| 3| 5个|3|
| r2| 0.5| 2| 3|六|2| 3|
| r3| 3| 4| 2| 4| 1|七个|
我想也许sort()grouping()可以是一个解决方案,但我不能想出如何使用这些来获得我想要的结果。

y4ekin9u

y4ekin9u1#

library(tidyr)
library(dplyr)

my_pivot <- build_longer_spec(df1, cols = starts_with("c"), names_to = "group")

df1 |>
  pivot_longer_spec(my_pivot) |>
  full_join(pivot_longer_spec(df2, my_pivot), by = c("replicate", "group"))

输出

replicate group value.x value.y
  <chr>     <chr>   <dbl>   <int>
1 r1        c1        2         3
2 r1        c2        3         5
3 r1        c3        1         3
4 r2        c1        0.5       6
5 r2        c2        2         2
6 r2        c3        3         3
7 r3        c1        3         4
8 r3        c2        4         1
9 r3        c3        2         7

数据

df1 <- structure(list(replicate = c("r1", "r2", "r3"), c1 = c(2, 0.5,
3), c2 = c(3L, 2L, 4L), c3 = c(1L, 3L, 2L)), class = "data.frame", row.names = c(NA,
-3L))

df2 <- structure(list(replicate = c("r1", "r2", "r3"), c1 = c(3L, 6L,
4L), c2 = c(5L, 2L, 1L), c3 = c(3L, 3L, 7L)), class = "data.frame", row.names = c(NA,
-3L))
bvpmtnay

bvpmtnay2#

不需要对列名进行排序,您可以通过选择元素1和4,2和5,3和6来计算根据需要重新排序列的排列。或者,更一般地:
1、(n + 1)、2、(n + 2)、3、(n + 3)、…
其中n是第一 Dataframe 的列数。
在R代码中:

n = ncol(df1)
df = cbind(df1, df2)[rep(seq_len(n), each = 2L) + c(0L, n)]
b09cbbtk

b09cbbtk3#

谢谢你的帮助!
我最终使用了CODER 1的答案,并稍作修改以获得我想要的结果。它还允许我使用多个 Dataframe 来扩展工作流,这些 Dataframe 都具有相同的列名。我知道最好有不同的列名,但我必须使用现有的列名。
为了让它工作,我使用了:

#combine files
    combined <- cbind(df1, df2, ...)

    #order column names
    #for me decreasing = TRUE was what I needed, but I believe that is not necessary
    ordered_cols <- order(colnames(combined), decreasing = TRUE)

    #order combined data frame by ordered column labels
    ordered_combined <- (combined[, ordered_cols])

    #make .csv file if you want
    write.csv(ordered_combined, file = "ordered_combined.csv")

这最终也会自动分配唯一的列名。
我知道这可能不是最好的代码,我相信它可以优化,但它似乎为我工作。谢谢大家的帮助!

bq9c1y66

bq9c1y664#

要通过将列分组来合并两个 Dataframe ,可以使用R中的cbind()函数。但是,要实现将列排序并分组在一起的期望输出,可以使用order()函数对列名进行排序,然后使用排序后的列名从两个数据框中选择列。下面是一个例子:

# Sample data frames
df1 <- data.frame(c1 = c(2, 0.5, 3),
                  c2 = c(3, 2, 4),
                  c3 = c(1, 3, 2),
                  row.names = c("r1", "r2", "r3"))

df2 <- data.frame(c1 = c(3, 6, 4),
                  c2 = c(5, 2, 1),
                  c3 = c(3, 3, 7),
                  row.names = c("r1", "r2", "r3"))

# Sort column names
sorted_cols <- sort(colnames(df1))

# Combine data frames by grouping columns
combined <- cbind(df1[, sorted_cols], df2[, sorted_cols])

# Print the combined data frame
print(combined)

输出:

c1   c1 c2 c2 c3 c3
r1  2    3  3  5  1  3
r2  0.5  6  2  2  3  3
r3  3    4  4  1  2  7

在本例中,sorted_cols变量存储来自df1的排序列名。然后,使用cbind()函数将列与df1df2中排序的列名组合起来,得到所需的输出。

相关问题