gpt4 book ai didi

r - 如何在 R 中按组向量进行 rowSums?

转载 作者:行者123 更新时间:2023-12-04 01:53:49 25 4
gpt4 key购买 nike

假设我有一个像这样的数据框:

df<-data.frame(A.1=1:5,B.1=2:6,C.1=3:7, 
D.2=4:8,E.2=5:9,F.2=6:10)
df
A.1 B.1 C.1 D.2 E.2 F.2
1 1 2 3 4 5 6
2 2 3 4 5 6 7
3 3 4 5 6 7 8
4 4 5 6 7 8 9
5 5 6 7 8 9 10

我想要的是 rowSums() 通过一个组向量,它是 df 的列名,没有字母(例如 c(1,1,1 ,2,2,2)) 输出为:

      1  2
[1,] 6 15
[2,] 9 18
[3,] 12 21
[4,] 15 24
[5,] 18 27

我的真实数据集有来自 18 个组的超过 110,000 个 cols,并且会找到一种优雅而简单的方法来实现它。

最佳答案

由于 data.frame 的内部结构方式,按行操作通常比按列操作慢得多。鉴于您对这个 data.frame 实际上有多大的评论,我可能会使用 data.table 将其转换为 long,将组隔离为它自己的变量,然后执行分组总和。

df <- data.frame(
A.1 = 1:5,
B.1 = 6:10,
C.2 = 11:15,
D.2 = 16:20
)

首先,使用setDTdata.frame转换为data.table

library(data.table)

setDT(df)

然后,添加一个row_number列(:=创建一个新列;.N是一个包含行数的特殊变量表)。

df[, row_number := 1:.N]

将其转换为“长”data.table,使用 row_number 作为唯一 ID 列。

df_long <- melt(df, id.vars = "row_number")
df_long
#> row_number variable value
#> 1: 1 A.1 1
#> 2: 2 A.1 2
#> 3: 3 A.1 3
#> 4: 4 A.1 4
#> 5: 5 A.1 5
#> 6: 1 B.1 6
#> 7: 2 B.1 7
#> 8: 3 B.1 8
#> 9: 4 B.1 9
#> 10: 5 B.1 10
#> 11: 1 C.2 11
#> 12: 2 C.2 12
#> 13: 3 C.2 13
#> 14: 4 C.2 14
#> 15: 5 C.2 15
#> 16: 1 D.2 16
#> 17: 2 D.2 17
#> 18: 3 D.2 18
#> 19: 4 D.2 19
#> 20: 5 D.2 20

创建一个新的 group 列,其中包含“.”之后的所有内容。在新的“变量”列中(^.*?\\. 是从字符串开头到第一个“.”的所有内容;gsub(pattern, "", variable)variable 中移除 pattern

df_long[, group := as.integer(gsub("^.*?\\.", "", variable))]
df_long
#> row_number variable value group
#> 1: 1 A.1 1 1
#> 2: 2 A.1 2 1
#> 3: 3 A.1 3 1
#> 4: 4 A.1 4 1
#> 5: 5 A.1 5 1
#> 6: 1 B.1 6 1
#> 7: 2 B.1 7 1
#> 8: 3 B.1 8 1
#> 9: 4 B.1 9 1
#> 10: 5 B.1 10 1
#> 11: 1 C.2 11 2
#> 12: 2 C.2 12 2
#> 13: 3 C.2 13 2
#> 14: 4 C.2 14 2
#> 15: 5 C.2 15 2
#> 16: 1 D.2 16 2
#> 17: 2 D.2 17 2
#> 18: 3 D.2 18 2
#> 19: 4 D.2 19 2
#> 20: 5 D.2 20 2

最后,按row_numbergroup 进行sum(value) 分组。这些类型的操作在 data.table 中非常快,比基础 R 更快、更高效。

df_long[, sum(value), by = list(row_number, group)]
#> row_number group V1
#> 1: 1 1 7
#> 2: 2 1 9
#> 3: 3 1 11
#> 4: 4 1 13
#> 5: 5 1 15
#> 6: 1 2 27
#> 7: 2 2 29
#> 8: 3 2 31
#> 9: 4 2 33
#> 10: 5 2 35

关于r - 如何在 R 中按组向量进行 rowSums?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51733153/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com