在 data.table 中分组,选择多列中的第一个元素
Group-by in data.table with choosing first element in multiple columns
给定数据table:
DT <- data.table(C1=1:6,C2=10:15,C3=1:3,C4=c("A","B"))
C1 C2 C3 C4
1: 1 10 1 A
2: 2 11 2 B
3: 3 12 3 A
4: 4 13 1 B
5: 5 14 2 A
6: 6 15 3 B
如果我想按 C4 分组,计算 C3 的平均值并显示 C1 中的第一个元素,我会这样做:
DT[, list(C1=C1[1], AVG_C3=mean(C3), Freq=.N), by=C4]
C4 C1 AVG_C3 Freq
1: A 1 2 3
2: B 2 2 3
如果我想获取C2中的第一个元素,那么我在上面的行中添加C2[1]
:
DT[, list(C1=C1[1], C2=C2[1], AVG_C3=mean(C3), Freq=.N), by=C4]
考虑到我有数百列并且我希望看到上面解释的第一个元素,我将如何处理这个任务?
也许有一些简单的方法,比如使用所需列 cols <- c("C1","C2")
的向量,但我不知道如何在 DT[]
内分配给 cols
。我在这里查看了分配给多个列 Assign multiple columns using := in data.table, by group ,但我不确定如何在这种情况下实现它。感谢您的反馈:)
假设你想分别看到C1
、C2
和C3
的第一个元素,你可以在.SD
和.SD
上使用head
和使用 .SDcols
.
指定列名
cols <- c("C1", "C2", "C3")
DT[, c(head(.SD, 1), list(AVG_C3=mean(C3), Freq=.N)), by=C4, .SDcols = cols]
C4 C1 C2 C3 AVG_C3 Freq
1: A 1 10 1 2 3
2: B 2 11 2 2 3
我们可以通过'C4'对指定列进行汇总统计,并加入on
原始数据集得到相应的行。
DT[DT[, .(Avg_C3= mean(C3), freq= .N, C1 = C1[1L]) , by = C4], on = c("C4", "C1")]
# C1 C2 C3 C4 Avg_C3 freq
#1: 1 10 1 A 2 3
#2: 2 11 2 B 2 3
或使用 dplyr
的选项
library(dplyr)
DT %>%
group_by(C4) %>%
mutate(Avg_C3 = mean(C3), freq = n(), C1 = first(C1)) %>%
slice(1L)
# C1 C2 C3 C4 Avg_C3 freq
# <int> <int> <int> <chr> <dbl> <int>
#1 1 10 1 A 2 3
#2 2 11 2 B 2 3
给定数据table:
DT <- data.table(C1=1:6,C2=10:15,C3=1:3,C4=c("A","B"))
C1 C2 C3 C4
1: 1 10 1 A
2: 2 11 2 B
3: 3 12 3 A
4: 4 13 1 B
5: 5 14 2 A
6: 6 15 3 B
如果我想按 C4 分组,计算 C3 的平均值并显示 C1 中的第一个元素,我会这样做:
DT[, list(C1=C1[1], AVG_C3=mean(C3), Freq=.N), by=C4]
C4 C1 AVG_C3 Freq
1: A 1 2 3
2: B 2 2 3
如果我想获取C2中的第一个元素,那么我在上面的行中添加C2[1]
:
DT[, list(C1=C1[1], C2=C2[1], AVG_C3=mean(C3), Freq=.N), by=C4]
考虑到我有数百列并且我希望看到上面解释的第一个元素,我将如何处理这个任务?
也许有一些简单的方法,比如使用所需列 cols <- c("C1","C2")
的向量,但我不知道如何在 DT[]
内分配给 cols
。我在这里查看了分配给多个列 Assign multiple columns using := in data.table, by group ,但我不确定如何在这种情况下实现它。感谢您的反馈:)
假设你想分别看到C1
、C2
和C3
的第一个元素,你可以在.SD
和.SD
上使用head
和使用 .SDcols
.
cols <- c("C1", "C2", "C3")
DT[, c(head(.SD, 1), list(AVG_C3=mean(C3), Freq=.N)), by=C4, .SDcols = cols]
C4 C1 C2 C3 AVG_C3 Freq
1: A 1 10 1 2 3
2: B 2 11 2 2 3
我们可以通过'C4'对指定列进行汇总统计,并加入on
原始数据集得到相应的行。
DT[DT[, .(Avg_C3= mean(C3), freq= .N, C1 = C1[1L]) , by = C4], on = c("C4", "C1")]
# C1 C2 C3 C4 Avg_C3 freq
#1: 1 10 1 A 2 3
#2: 2 11 2 B 2 3
或使用 dplyr
library(dplyr)
DT %>%
group_by(C4) %>%
mutate(Avg_C3 = mean(C3), freq = n(), C1 = first(C1)) %>%
slice(1L)
# C1 C2 C3 C4 Avg_C3 freq
# <int> <int> <int> <chr> <dbl> <int>
#1 1 10 1 A 2 3
#2 2 11 2 B 2 3