簡體   English   中英

如何在R中將數據框從行級別重塑為人級別

[英]How to reshape data frame from a row level to person level in R

我有以下 Netflix 實驗代碼,用於降低 Netflix 的價格,看看人們看電視的次數是多還是少。 每次有人使用 Netflix 時,它都會顯示他們觀看了哪些內容以及觀看了多長時間。

**library(tidyverse)
sample_size <- 10000
set.seed(853)
viewing_data <-
tibble(unique_person_id = sample(x = c(1:100),
size = sample_size,
replace = TRUE),
tv_show = sample(x = c("Broadchurch", "Duty-Shame", "Drive to Survive", "Shetland", "The Crown"),
size = sample_size,
replace = TRUE),
)**

然后我想編寫一些代碼,將人們隨機分配到兩組中的一組 - 治療組和控制組。 但是,數據集位於行級別,因為有 1000 個觀察值。 我想將其更改為 R 中的人員級別,然后我可以簽署一個人是否接受治療。 一個人不應該被治療和不被治療。 但是,tv_show 為一個人顯示了很多次。 有誰知道在這種情況下如何重塑數據集?

library(dplyr)
treatment <- viewing_data %>% 
  distinct(unique_person_id) %>% 
  mutate(treated = sample(c("yes", "no"), size = 100, replace = TRUE))

viewing_data %>% 
  left_join(treatment, by = "unique_person_id")

如果需要,您可以更改采樣方式...

您可以執行以下操作,這會按人員 ID 對您的觀察進行分組,並為每組分配一個唯一的“治療/控制”:

library(dplyr)
viewing_data %>% 
group_by(unique_person_id) %>% 
mutate(group=sample(c("treated","control"),1))

# A tibble: 10,000 x 3
# Groups:   unique_person_id [100]
   unique_person_id tv_show          group  
              <int> <chr>            <chr>  
 1                9 Drive to Survive control
 2               64 Shetland         treated
 3               90 The Crown        treated
 4               93 Drive to Survive treated
 5               17 Duty-Shame       treated
 6               29 The Crown        control
 7               84 Broadchurch      control
 8               83 The Crown        treated
 9                3 The Crown        control
10               33 Broadchurch      control
# … with 9,990 more rows

我們可以檢查我們的結果,所有的 id 只有 1 組治療/控制:

newdata <- viewing_data %>% 
    group_by(unique_person_id) %>% 
    mutate(group=sample(c("treated","control"),1))

tapply(newdata$group,newdata$unique_person_id,n_distinct)
  1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20 
  1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1 
 21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40 
  1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1 
 41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60 
  1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1 
 61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80 
  1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1 
 81  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96  97  98  99 100 
  1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1 

如果您希望將人員隨機且均等地分配到兩組中(完全隨機分配),您可以使用以下代碼。

library(dplyr)

Persons <- viewing_data %>%
  distinct(unique_person_id) %>%
  mutate(group=sample(100),  # in case the ids are not truly random
         group=ifelse(group %% 2 == 0, 0, 1))  # works if only two groups
Persons

# A tibble: 100 x 2
   unique_person_id group
              <int> <dbl>
 1                1     0
 2                2     0
 3                3     1
 4                4     0
 5                5     1
 6                6     1
 7                7     1
 8                8     0
 9                9     1
10               10     0
# ... with 90 more rows

並檢查我們是否在每組中有 50 個:

Persons %>% count(group)

# A tibble: 2 x 2
  group     n
  <dbl> <int>
1     0    50
2     1    50

您還可以使用randomizr包,除了完全隨機分配之外,它還有更多功能。

library(randomizr)

Persons <- viewing_data %>%
  distinct(unique_person_id) %>%
  mutate(group=complete_ra(N=100, m=50))

Persons %>% count(group) # Check

要將其鏈接回 view_data,請使用inner_join

viewing_data %>% inner_join(Persons, by="unique_person_id")

# A tibble: 10,000 x 3
   unique_person_id tv_show          group
              <int> <chr>            <int>
 1               10 Shetland             1
 2               95 Broadchurch          0
 3                7 Duty-Shame           1
 4               68 Drive to Survive     0
 5               17 Drive to Survive     1
 6               70 Shetland             0
 7               78 Drive to Survive     0
 8               21 Broadchurch          1
 9               80 The Crown            0
10               70 Shetland             0
# ... with 9,990 more rows

暫無
暫無

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

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