I\'ve got a dataframe that\'s got lots of columns that are something like this:
data <- data.frame (a.1 = 1:5, a.2b = 3:7, a.5 = 5:9, bt.16 = 4:8, bt.1234
You can try
library(tidyverse)
data.frame (a.1 = 1:5, a.2b = 3:7, a.5 = 5:9, bt.16 = 4:8, bt.12342 = 7:11) %>%
rownames_to_column() %>%
gather(k, v, -rowname) %>%
separate(k, letters[1:2]) %>%
group_by(rowname, a) %>%
summarise(Sum=sum(v)) %>%
spread(a, Sum)
#> # A tibble: 5 x 3
#> # Groups: rowname [5]
#> rowname a bt
#> <chr> <int> <int>
#> 1 1 9 11
#> 2 2 12 13
#> 3 3 15 15
#> 4 4 18 17
#> 5 5 21 19
Created on 2018-04-16 by the reprex package (v0.2.0).
Here's another tidyverse
solution:
library(tidyverse)
t(data) %>%
data.frame() %>%
group_by(., id = gsub('\\..*', '', rownames(.))) %>%
summarise_all(sum) %>%
data.frame() %>%
column_to_rownames(var = 'id') %>%
t()
Result:
a bt
X1 9 11
X2 12 13
X3 15 15
X4 18 17
X5 21 19
Here a solution with base R:
> prefixes = unique(sub("\\..*", "", colnames(data)))
> sapply(prefixes, function(x)rowSums(data[,startsWith(colnames(data), x)]))
a bt
[1,] 9 11
[2,] 12 13
[3,] 15 15
[4,] 18 17
[5,] 21 19
data <- data.frame (a.1 = 1:5, a.2b = 3:7, a.5 = 5:9, bt.16 = 4:8, bt.12342 = 7:11)
i <- grepl("a.", names(data), fixed = TRUE)
result <- data.frame(a=rowSums(data[, i]), bt=rowSums(data[, !i]))
result
# > result
# a bt
# 1 9 11
# 2 12 13
# 3 15 15
# 4 18 17
# 5 21 19
If you have more than two prefixes you can do something like:
prefs <- c("a.", "bt.")
as.data.frame(lapply(prefs, function(p) rowSums(data[, grepl(p, names(data), fixed = TRUE)]) ))