对R中具有相似名称的列进行求和

时间:2018-04-16 13:53:13

标签: r

我有一个数据框,其中有很多列是这样的:

javac

我想要一个带有列的结果,这些列对具有相同前缀的变量求和。在这个例子中,我想返回一个数据帧: a =(9:13),bt =(11:15)

我的真实数据集相当复杂(我希望将网页的页面视图计数与不同的utm参数结合起来),但是这种情况的解决方案应该让我走上正轨。我确信我可以通过解决方案绊倒我,但我宁愿拥有优雅的代码

4 个答案:

答案 0 :(得分:3)

这是一个基础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

答案 1 :(得分:0)

你可以尝试

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

reprex package(v0.2.0)创建于2018-04-16。

答案 2 :(得分:0)

这是另一个tidyverse解决方案:

library(tidyverse)

t(data) %>%
  data.frame() %>%
  group_by(., id = gsub('\\..*', '', rownames(.))) %>%
  summarise_all(sum) %>%
  data.frame() %>%
  column_to_rownames(var = 'id') %>%
  t()

<强>结果:

    a bt
X1  9 11
X2 12 13
X3 15 15
X4 18 17
X5 21 19

答案 3 :(得分:0)

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

如果您有两个以上的前缀,您可以执行以下操作:

prefs <- c("a.", "bt.")
as.data.frame(lapply(prefs, function(p) rowSums(data[, grepl(p, names(data), fixed = TRUE)]) ))