根据 R 中的其他行和列组合在数据框中创建行
Create rows in a data frame based on other rows and column combination in R
我对 R 中的数据框有疑问,我有一些数据具有两个维度和一个指标,但某些类别组合没有数据。
我的数据如下所示:
interestAffinityCategory userGender users
1 Music Lovers male 198
2 Music Lovers female 190
3 News Junkies & Avid Readers male 134
4 News Junkies & Avid Readers female 115
5 Sports Fans male 109
6 Movie Lovers male 108
7 Technophiles male 93
8 TV Lovers male 88
9 TV Lovers female 79
10 Technophiles female 70
例如,体育迷,只有男性的数据。我需要所有类别,即使用户列中的值为 0。喜欢:体育迷,女性,0
我的数据需要如何:(第 8 行和第 6 行)
interestAffinityCategory userGender users
1 Music Lovers male 198
2 Music Lovers female 190
3 News Junkies & Avid Readers male 134
4 News Junkies & Avid Readers female 115
5 Sports Fans male 109
6 Sports Fans female 0
7 Movie Lovers male 108
8 Movie Lovers female 0
9 Technophiles male 93
10 TV Lovers male 88
11 TV Lovers female 79
12 Technophiles female 70
我试图找到解决方案,但我只找到类似的情况,但只有一个维度,对我来说不起作用。
Ps.: 这个数据来自Google Analytics API,我想得到前10个类别,并制作一个按性别划分访问量的图表,但是对于它,我需要显示所有类别和性别组合的数据,即使是 0 次访问。
您可以创建一个包含所有类别组合的数据框,并将 users
设置为零。然后您可以组合两个数据框,并为每个类别组合保留用户的最大值。
您可以使用 expand.grid()
:
创建包含所有组合的数据框
all_levels_0 <- expand.grid(levels(data$interestAffinityCategory), levels(data$userGender))
all_levels_0$users <- 0
names(all_levels_0) <- names(data)
head(all_levels_0)
## interestAffinityCategory userGender users
## 1 Movie Lovers female 0
## 2 Music Lovers female 0
## 3 News Junkies & Avid Readers female 0
## 4 Sports Fans female 0
## 5 Technophiles female 0
## 6 Technophiles female 0
(假设data$interestAffinityCategory
和data$userGender
都是因数,如果是字符,用unique()
代替levels()
。)
第二步,我用的是dplyr包:
library(dplyr)
all_levels <- bind_rows(data, all_levels_0) %>%
group_by(interestAffinityCategory, userGender) %>%
summarise(users = max(users))
head(all_levels)
## Source: local data frame [6 x 3]
## Groups: interestAffinityCategory [3]
##
## interestAffinityCategory userGender users
## (fctr) (fctr) (dbl)
## 1 Movie Lovers female 0
## 2 Movie Lovers male 108
## 3 Music Lovers female 190
## 4 Music Lovers male 198
## 5 News Junkies & Avid Readers female 115
## 6 News Junkies & Avid Readers male 134
如果您不想使用 dplyr,您可以对基础 R 中的 rbind()
和 aggregate()
执行相同的操作:
combined <- rbind(data, all_levels_0)
all_levels <- aggregate(users ~ interestAffinityCategory + userGender,
data = combined, FUN = max)
head(all_levels)
## interestAffinityCategory userGender users
## 1 Movie Lovers female 0
## 2 Music Lovers female 190
## 3 News Junkies & Avid Readers female 115
## 4 Sports Fans female 0
## 5 Technophiles female 70
## 6 Technophiles female 0
(这对行进行了不同的排序,因此前几行与 dplyr 示例中的不同。)
您应该使用 tidyr
中的 complete
函数。第一个参数是你的数据,第二个和第三个是你想要找到所有可能组合的列(如果你有更多,你可以一个一个地列出它们),fill
是一个具有默认值的列表填写。
complete(data, interestAffinityCategory, userGender, fill=list(users=0))
我对 R 中的数据框有疑问,我有一些数据具有两个维度和一个指标,但某些类别组合没有数据。 我的数据如下所示:
interestAffinityCategory userGender users
1 Music Lovers male 198
2 Music Lovers female 190
3 News Junkies & Avid Readers male 134
4 News Junkies & Avid Readers female 115
5 Sports Fans male 109
6 Movie Lovers male 108
7 Technophiles male 93
8 TV Lovers male 88
9 TV Lovers female 79
10 Technophiles female 70
例如,体育迷,只有男性的数据。我需要所有类别,即使用户列中的值为 0。喜欢:体育迷,女性,0 我的数据需要如何:(第 8 行和第 6 行)
interestAffinityCategory userGender users
1 Music Lovers male 198
2 Music Lovers female 190
3 News Junkies & Avid Readers male 134
4 News Junkies & Avid Readers female 115
5 Sports Fans male 109
6 Sports Fans female 0
7 Movie Lovers male 108
8 Movie Lovers female 0
9 Technophiles male 93
10 TV Lovers male 88
11 TV Lovers female 79
12 Technophiles female 70
我试图找到解决方案,但我只找到类似的情况,但只有一个维度,对我来说不起作用。
Ps.: 这个数据来自Google Analytics API,我想得到前10个类别,并制作一个按性别划分访问量的图表,但是对于它,我需要显示所有类别和性别组合的数据,即使是 0 次访问。
您可以创建一个包含所有类别组合的数据框,并将 users
设置为零。然后您可以组合两个数据框,并为每个类别组合保留用户的最大值。
您可以使用 expand.grid()
:
all_levels_0 <- expand.grid(levels(data$interestAffinityCategory), levels(data$userGender))
all_levels_0$users <- 0
names(all_levels_0) <- names(data)
head(all_levels_0)
## interestAffinityCategory userGender users
## 1 Movie Lovers female 0
## 2 Music Lovers female 0
## 3 News Junkies & Avid Readers female 0
## 4 Sports Fans female 0
## 5 Technophiles female 0
## 6 Technophiles female 0
(假设data$interestAffinityCategory
和data$userGender
都是因数,如果是字符,用unique()
代替levels()
。)
第二步,我用的是dplyr包:
library(dplyr)
all_levels <- bind_rows(data, all_levels_0) %>%
group_by(interestAffinityCategory, userGender) %>%
summarise(users = max(users))
head(all_levels)
## Source: local data frame [6 x 3]
## Groups: interestAffinityCategory [3]
##
## interestAffinityCategory userGender users
## (fctr) (fctr) (dbl)
## 1 Movie Lovers female 0
## 2 Movie Lovers male 108
## 3 Music Lovers female 190
## 4 Music Lovers male 198
## 5 News Junkies & Avid Readers female 115
## 6 News Junkies & Avid Readers male 134
如果您不想使用 dplyr,您可以对基础 R 中的 rbind()
和 aggregate()
执行相同的操作:
combined <- rbind(data, all_levels_0)
all_levels <- aggregate(users ~ interestAffinityCategory + userGender,
data = combined, FUN = max)
head(all_levels)
## interestAffinityCategory userGender users
## 1 Movie Lovers female 0
## 2 Music Lovers female 190
## 3 News Junkies & Avid Readers female 115
## 4 Sports Fans female 0
## 5 Technophiles female 70
## 6 Technophiles female 0
(这对行进行了不同的排序,因此前几行与 dplyr 示例中的不同。)
您应该使用 tidyr
中的 complete
函数。第一个参数是你的数据,第二个和第三个是你想要找到所有可能组合的列(如果你有更多,你可以一个一个地列出它们),fill
是一个具有默认值的列表填写。
complete(data, interestAffinityCategory, userGender, fill=list(users=0))