将列标题拆分为R中的行元素

时间:2017-07-06 16:52:41

标签: r algorithm packages

使用R对较大的数据集进行数据分析后,得到如下面的示例数据所示的输出:

   A_B C_D E_F G_H
1   1   1   0   0 
2   1   0   1   1
3   1   1   0   1
4   0   0   1   1
5   1   0   1   1
6   0   0   0   1

目前,我正在尝试将列标题拆分为两个不同的列作为元素出现,并获得它们所代表的列的总和。它看起来像这样:

   P1  P2  Sum
1   A   B   4
2   C   D   2
3   E   F   3
4   G   H   5

对于每列的总和,我可以直接使用colSums(),但是我对如何拆分列标题并使它们显示为上述单元格元素感到纠结。

请告诉我有关如何处理此事的任何建议,谢谢。

3 个答案:

答案 0 :(得分:1)

生成样本数据

df1 <- structure(list(A_B = c(1L, 1L, 1L, 0L, 1L, 0L), C_D = c(1L, 0L, 
 1L, 0L, 0L, 0L), E_F = c(0L, 1L, 0L, 1L, 1L, 0L), G_H = c(0L, 
1L, 1L, 1L, 1L, 1L)), .Names = c("A_B", "C_D", "E_F", "G_H"),
 class = "data.frame", row.names = c("1", 
 "2", "3", "4", "5", "6"))

方法1:strsplit

d1 <- data.frame(do.call(rbind, strsplit(names(df1), "_")), Sum = as.vector(colSums(df1)))
names(d1)[1:2] <- c('P1', 'P2')
d1
#   P1 P2 Sum
#1  A  B   4
#2  C  D   2
#3  E  F   3
#4  G  H   5

方法2:tidyverse

library(tidyverse)
gather(df1) %>%
       separate(key, into = c('P1', 'P2')) %>% 
       group_by(P1, P2) %>% 
       summarise(Sum = sum(value))
# A tibble: 4 x 3
# Groups:   P1 [?]
#     P1    P2   Sum
#  <chr> <chr> <int>
#1     A     B     4
#2     C     D     2
#3     E     F     3
#4     G     H     5

答案 1 :(得分:1)

像这样试试read.table(text = ...)。如果您更喜欢因子列,请忽略as.is = TRUE

在下面的注释中,我们假设了一个数据框,但如果输入是一个矩阵,那么相同的代码应该可以工作。

没有使用任何包裹。

DF2 <- read.table(text = colnames(DF), sep = "_", as.is = TRUE, col.names = c("P1", "P2"))
data.frame(DF2, Sum = colSums(DF), row.names = NULL)

,并提供:

  P1 P2 Sum
1  A  B   4
2  C  D   2
3  E  F   3
4  G  H   5

注意:上面以可重现的形式使用的输入数据框是:

Lines <- "A_B C_D E_F G_H
1   1   1   0   0 
2   1   0   1   1
3   1   1   0   1
4   0   0   1   1
5   1   0   1   1
6   0   0   0   1"

DF <- read.table(text = Lines, header = TRUE)

答案 2 :(得分:1)

这是我的解决方案

library(tidyr)
library(dplyr)
df1=data.frame(melt(df))%>%group_by(variable)%>%dplyr::summarise(value=sum(value))
df2 <- separate(df1, variable, into = c("P1","P2"), sep = "_", extra = "merge")

     P1    P2 value
* <chr> <chr> <int>
1     A     B     4
2     C     D     2
3     E     F     3
4     G     H     5