如何通过在R语言中对相同的变量进行分组来将行合并为单列

Posted

技术标签:

【中文标题】如何通过在R语言中对相同的变量进行分组来将行合并为单列【英文标题】:How to merge rows into single column by grouping the same variable in R language 【发布时间】:2022-01-14 02:53:06 【问题描述】:

我有一个数据框

type   function   class
A      AXX        AYY
A      AZZ        AUU
B      BXX        BYY
B      BUU        BHH 

我想把它们变成

type   function   class   type    function  class  
A      AXX        AYY     A      AZZ        AUU
B      BXX        BYY     B      BUU        BHH 

我确实尝试使用 dcastmelt,但没有为我锻炼,我是 R 新手,请帮助

【问题讨论】:

R 不喜欢重复的列名。我能问一下你通过这种方式格式化你的列想要达到什么目的吗? 【参考方案1】:

这是另一个命题:

library(dplyr)
library(tidyr)
library(purrr)

df <- data.frame(
  stringsAsFactors = FALSE,
       check.names = FALSE,
              type = c("A", "A", "B", "B"),
        `function` = c("AXX", "AZZ", "BXX", "BUU"),
             class = c("AYY", "AUU", "BYY", "BHH")
      )

df <- df %>% 
  group_by(type) %>% 
  mutate(id = row_number())

df <- split(df, df$id)
df <- map(df, select, -id)
df <- reduce(df, cbind)
names(df) <- gsub("[.]*\\d$", "", names(df))

但是,我担心列同名以后可能会出现问题。

【讨论】:

【参考方案2】:

这是你所期待的吗?

library(dplyr)

my_df <- data.frame("type" = c("A", "A", "B", "B", "C"),
                "function1" = c("AXX", "AZZ", "BXX", "BUU", "CCC"),
                "class1" = c("AYY", "AUU", "BYY", "BHH", "CCC"),
                stringsAsFactors = FALSE)

my_df <- my_df %>% group_by(type) %>% mutate(My_id = cur_group_id())
my_base <- my_df %>% group_by(type) %>% filter(row_number() == 1)
my_other <- my_df %>% group_by(type) %>% filter(row_number() != 1)
my_base <- left_join(x = my_base, y = my_other, by = "My_id")
colnames(my_base) <- gsub(pattern = "\\.x$|\\.y$", replacement = "", x = colnames(my_base))
my_base <- my_base[, -which(colnames(my_base) == "My_id")]

【讨论】:

【参考方案3】:

我认为所有(尚未)提出的解决方案只有在类型元素在 data.frame 中只有一次或两次时才有效。我不确定您的数据是否总是如此,因此我在我的解决方案中添加了一个 if 条件。

result = NULL
dataCount <- max(as.data.frame(table(data$type))[,2])
if (dataCount <= 2)
  data1 <- data[duplicated(data$type),]
  data2 <- data[!duplicated(data$type),]
  result <- merge(data2, data1, by="type", all.x=T)
 
>result
      type function..x class.x function..y class.y
    1    A         AXX     AYY         AZZ     AUU
    2    B         BXX     BYY         BUU     BHH

如果您想创建,那么您要求的 data.frame 可以简单地执行:

result$type.y <- result$type
result <- result[,c(1,2,3,6,4,5)]
names(result) <- unlist(lapply(1:ncol(result), function(x) strsplit(names(result)[x], "[.]")[[1]][1] ))

> result
  type function class type function class
1    A      AXX   AYY    A      AZZ   AUU
2    B      BXX   BYY    B      BUU   BHH

但是,一般来说,我建议避免使用 function 作为列名(例如,改用 function2use),因为它是 R 中的内置名称,并使用合并输出中的命名,例如class.x 和 class.y 而不是两次使用相同的列名。

【讨论】:

以上是关于如何通过在R语言中对相同的变量进行分组来将行合并为单列的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MySQL 中对具有不同平均值的三个变量进行分组?

R语言使用caret包的featurePlot函数可视化变量的重要性通过分组数据分布差异查看变量对于预测目标变量的判别性通过可视化密度图进行判别分析

R语言使用caret包的featurePlot函数可视化变量的重要性通过分组数据分布差异查看变量对于预测目标变量的判别性通过可视化密度图进行判别分析

R语言数据合并-cbind(),rbind

R语言使用caret包的featurePlot函数可视化变量的重要性通过分组数据分布差异查看变量对于预测目标变量的判别性通过可视化箱图进行判别分析

excel中,如何合把行的数据合并到列