如何在保留原始数据帧的同时获取组级统计信息?
How to get group-level statistics while preserving the original dataframe?
我有以下数据框
one <- c('one',NA,NA,NA,NA,'two',NA,NA)
group1 <- c('A','A','A','A','B','B','B','B')
group2 <- c('C','C','C','D','E','E','F','F')
df = data.frame(one, group1,group2)
> df
one group1 group2
1 one A C
2 <NA> A C
3 <NA> A C
4 <NA> A D
5 <NA> B E
6 two B E
7 <NA> B F
8 <NA> B F
我想为 group1
和 group2
的每个组合获取 one
的非缺失观察值的计数。
在 Pandas 中,我会使用 groupby(['group1','group2']).transform
,但我如何在 R 中做到这一点?原始数据框很大。
预期输出为:
> df
one group1 group2 count
1 one A C 1
2 <NA> A C 1
3 <NA> A C 1
4 <NA> A D 0
5 <NA> B E 1
6 two B E 1
7 <NA> B F 0
8 <NA> B F 0
非常感谢!
与 data.table
:
setDT(df)
df[,count_B:=sum(!is.na(one)),by=c("group1","group2")]
给出:
one group1 group2 count_B
1: one A C 1
2: NA A C 1
3: NA A C 1
4: NA A D 0
5: NA B E 1
6: two B E 1
7: NA B F 0
8: NA B F 0
想法是在按 group1
和 group2
.
分组时对 B 不是 NA
的真实值(1 一次转换为整数)求和
library(dplyr)
df %>% group_by(group1, group2) %>% mutate(count = sum(!is.na(one)))
Source: local data frame [8 x 4]
Groups: group1, group2 [4]
one group1 group2 count
<fctr> <fctr> <fctr> <int>
1 one A C 1
2 NA A C 1
3 NA A C 1
4 NA A D 0
5 NA B E 1
6 two B E 1
7 NA B F 0
8 NA B F 0
我们不要忘记 base
R 可以完成很多事情,尽管有时效率不如 data.table
或 dplyr
:
df$count<-ave(as.integer(df$one),df[,2:3],FUN=function(x) sum(!is.na(x)))
# one group1 group2 count
#1 one A C 1
#2 <NA> A C 1
#3 <NA> A C 1
#4 <NA> A D 0
#5 <NA> B E 1
#6 two B E 1
#7 <NA> B F 0
#8 <NA> B F 0
我有以下数据框
one <- c('one',NA,NA,NA,NA,'two',NA,NA)
group1 <- c('A','A','A','A','B','B','B','B')
group2 <- c('C','C','C','D','E','E','F','F')
df = data.frame(one, group1,group2)
> df
one group1 group2
1 one A C
2 <NA> A C
3 <NA> A C
4 <NA> A D
5 <NA> B E
6 two B E
7 <NA> B F
8 <NA> B F
我想为 group1
和 group2
的每个组合获取 one
的非缺失观察值的计数。
在 Pandas 中,我会使用 groupby(['group1','group2']).transform
,但我如何在 R 中做到这一点?原始数据框很大。
预期输出为:
> df
one group1 group2 count
1 one A C 1
2 <NA> A C 1
3 <NA> A C 1
4 <NA> A D 0
5 <NA> B E 1
6 two B E 1
7 <NA> B F 0
8 <NA> B F 0
非常感谢!
与 data.table
:
setDT(df)
df[,count_B:=sum(!is.na(one)),by=c("group1","group2")]
给出:
one group1 group2 count_B
1: one A C 1
2: NA A C 1
3: NA A C 1
4: NA A D 0
5: NA B E 1
6: two B E 1
7: NA B F 0
8: NA B F 0
想法是在按 group1
和 group2
.
NA
的真实值(1 一次转换为整数)求和
library(dplyr)
df %>% group_by(group1, group2) %>% mutate(count = sum(!is.na(one)))
Source: local data frame [8 x 4] Groups: group1, group2 [4] one group1 group2 count <fctr> <fctr> <fctr> <int> 1 one A C 1 2 NA A C 1 3 NA A C 1 4 NA A D 0 5 NA B E 1 6 two B E 1 7 NA B F 0 8 NA B F 0
我们不要忘记 base
R 可以完成很多事情,尽管有时效率不如 data.table
或 dplyr
:
df$count<-ave(as.integer(df$one),df[,2:3],FUN=function(x) sum(!is.na(x)))
# one group1 group2 count
#1 one A C 1
#2 <NA> A C 1
#3 <NA> A C 1
#4 <NA> A D 0
#5 <NA> B E 1
#6 two B E 1
#7 <NA> B F 0
#8 <NA> B F 0