使用列名模式对R中的多个列求和,并更改列数(2到3)

rqenqsqc  于 2023-04-18  发布在  其他
关注(0)|答案(2)|浏览(126)

我有一个10列的 Dataframe 。
我需要

  • 首先对列1+2和3+4求和,
  • 然后对5+6+7列和8+9+10列求和;
  • 并保存为 Dataframe 。

我已经使它工作(见下文),但手动,使用2个sapply函数,然后trbind,因此我寻求更优雅的解决方案。

列名称显示出明显的模式

  • 前4列 * 的列表如下所示:“on_b_, off_b_”并重复(因此,我对列 1和2 求和,然后对列 3和4 求和)
  • 接下来的6列 * 的列表看起来像这样:“on_b_, something else in between, off_b_”并重复(因此我总结了 5 & 6 & 7,然后是 8 & 9 & 10
    我需要函数在再次看到列表开头时重新启动.开头的是名称以on_b_开头的列:
    on_B_(中间完全不相关的其他内容,如CC_,或根本不存在)off_b_
    以下是可重现的代码块:
df = structure(list(on_b_pos_1 = 64, off_b_4 = 25, 
                    on_b_6 = 28, off_b_8 = 157, 
                    on_b_3 = 42, CC_2 = 0,  off_b_4 = 125, 
                    on_b_5 = 51, CC_7 = 0, off_b_8 = 15), 
               row.names = 14L, class = "data.frame")

这是我以前做过的,它有效:

# adding together TWO columns
a <- data.frame(sapply(seq(1,4,by=2),function(i) rowSums(df[,i:(i+1)])))

# check whether the function i is getting the correct columns where it restarts
# seq(1,4,by=2) 

# adding together THREE columns
b <- data.frame(sapply(seq(5,ncol(df),by=3),function(i) rowSums(df[,i:(i+2)])))

# transpose
a <- t(a)
b <- t(b)

c <- cbind(a, b)

结果应该是这样的:

Column 1  Column 2  Column 3  Column 4
  89        185       167        66
31moq8wy

31moq8wy1#

您可以使用purrr包中的map2函数,在其中查找以grep的“on”或“off”开头的列索引。
如果您的df中有多个行,请使用sapplymap Package 我的代码以迭代这些行。

library(purrr)

map2_int(grep("^on", colnames(df)), 
         grep("^off", colnames(df)), 
         ~rowSums(df[, .x:.y]))

[1]  89 185 167  66
unhi4e5o

unhi4e5o2#

不知道你会认为什么是优雅的-这里是一个Tidyverse解决方案(大约比我的机器上@benson23的解决方案慢16倍):

library(tidyverse)

# transpose and convert to tibble
df2 <- df |> 
  t() |> 
  as_tibble(rownames = "label", .name_repair = "none") |> 
  rename(value = 2)

# add counter and summarize
df2 |> 
  mutate(
    start = str_detect(label, "^(on|off)"),
    count = cumsum(start),
    grp = (count - 1) %/% 2
  ) |> 
  summarize(sum(value), .by = grp)
#> # A tibble: 4 × 2
#>     grp `sum(value)`
#>   <dbl>        <dbl>
#> 1     0           89
#> 2     1          185
#> 3     2          167
#> 4     3           66

创建于2023-04-12带有reprex v2.0.2

相关问题