簡體   English   中英

根據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

我試圖找到一個解決方案,但我只發現了類似的案例,但是只有一個維度,對我來說不起作用。

附言:此數據來自Google Analytics(分析)API,我想獲得排名前10位的類別,並制作一張按性別進行訪問的圖表,但為此,我需要顯示所有類別和性別組合的數據,即使0訪問。

您應該使用tidyrcomplete函數。 第一個參數是數據,第二個和第三個是要查找所有可能的組合的列(如果有更多組合,則可以一個一個地列出),並且fill是一個列表,其中包含要填充的默認值。

complete(data, interestAffinityCategory, userGender, fill=list(users=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$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,你可以用同樣的rbind()aggregate()從基礎R:

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示例中的行不同。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM