1

我在 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

例如,Sport Fans,只有男性的数据。我需要所有类别,即使用户列中的值为 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访问。

4

2 回答 2

4

您应该complete使用tidyr. 第一个参数是你的数据,第二个和第三个是你想要找到所有可能的组合的列(如果你有更多,你可以一个一个地列出它们),并且fill是一个带有默认值的列表来填写。

complete(data, interestAffinityCategory, userGender, fill=list(users=0))
于 2016-03-11T22:44:54.737 回答
1

您可以创建一个所有类别组合的数据框,并将其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$interestAffinityCategorydata$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,你可以对base 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 示例中的不同。)

于 2016-03-11T21:39:34.043 回答