使用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()
,但是我对如何拆分列标题并使它们显示为上述单元格元素感到纠结。
请告诉我有关如何处理此事的任何建议,谢谢。
答案 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"))
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
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