簡體   English   中英

將重復數據從長轉換為寬,同時保留 R 中的鍵值對

[英]Convert Duplicated data from long to wide, while preserving key-value pairs in R

我需要從重復的數據集創建一個唯一的數據集(基於“ id ”變量),其中重復的數量變化很大。 我在下面創建了一個虛擬數據集(有 5 個鍵值對),它捕捉了真實數據集的本質。

library(dplyr)

df <- data.frame(id = c(1, 2, 3, 3, 2, 3), key = c(NA, "UJD02 JFF00", "UJD05 TPX10 DV071", "KFC10 DR036 UGC12 UEN05 XXA00", "UJD05", "DR036 UJD05 JFF00 TPX10"), value1 = c(23, NA, 45, 67, 11, 1), value2 = c(45, NA, 23, NA, 25, 78), value3 = c(89, NA, 103, 6700, 89, 50), value4 = c(786, 670, 987, 67, 12, 14), value5 = c(10, NA, 29, 15, 51, 3))

真實數據集包含由“ id ”變量確定的唯一觀察和重復觀察,重復的數量從兩個到重復超過 2 個的不等。 id ”變量指示哪些觀察值將從長轉換為寬,以便最終得到唯一“ id ”記錄的數據集,即沒有重復的“ id”。 key ”變量是一個復合變量,可以包含最多 30 個制表符分隔的缺失值(即 NA)。 正好有 30 個“ value X ”變量(即value1 - value30 )。 在觀察中(不考慮重復狀態),每個鍵都與一個值相關聯,例如key1value1key2value2 ... key30value30 重復表示數據是在不同時間點為同一客戶收集的,因此在從長到寬的轉換過程中,不應混淆重復項的各自鍵值對。

我做的第一件事是將復合“ key ”變量拆分為 30 個變量( key1 - key30 ),從而生成類似於“ df2 ”的數據集。

df %>% separate(key, c("key1", "key2", "key3", "key4", "key5")) -> df2

但在那之后,我不確定如何基於“ id ”進行重復數據刪除,同時避免混淆鍵值對。 也許我可能需要動態重命名(通過編號)鍵值對以指示重復項? 現在真的確定了。

因此,我需要幫助的地方是如何將長數據集( df2 )轉換為寬數據集,並以唯一的“ id ”變量(只有 3 行 id 1 - 3)結束,鍵值對沒有混淆即指示哪些鍵記錄與哪些值對搭配。 例如,在虛擬數據集中,對於重復 3 次的id = 3,我最終會得到key1 - value1 ... key15 - value15

非常感謝任何幫助!

編輯以提供示例輸出

以下是所需的輸出

library(wrapr)

resultX <- wrapr::build_frame(
  "id"  , "key1"       , "key2"       , "key3"       , "key4", "key5", "key6"       , "key7"       , "key8"       , "key9"       , "key10"      , "key11"      , "key12"      , "key13"      , "key14"      , "key15", "value1", "value2", "value3", "value4", "value5", "value6", "value7", "value8", "value9", "value10", "value11", "value12", "value13", "value14", "value15" |
    1   , NA_character_, NA_character_, NA_character_, NA    , NA    , NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, NA     , 23      , 45      , 89      , 786     , 10      , NA_real_, NA_real_, NA_real_, NA_real_, NA_real_ , NA_real_ , NA_real_ , NA_real_ , NA_real_ , NA_real_  |
    2   , "UJD02"      , "JFF00"      , NA_character_, NA    , NA    , "UJD05"      , NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, NA     , NA_real_, NA_real_, NA_real_, 670     , NA_real_, 11      , 25      , 89      , 12      , 51       , NA_real_ , NA_real_ , NA_real_ , NA_real_ , NA_real_  |
    3   , "UJD05"      , "TPX10"      , "DV071"      , NA    , NA    , "KFC10"      , "DR036"      , "UGC12"      , "UEN05"      , "XXA00"      , "DR036"      , "UJD05"      , "JFF00"      , "TPX10"      , NA     , 45      , 23      , 103     , 987     , 29      , 67      , NA_real_, 6700    , 67      , 15       , 1        , 78       , 50       , 14       , 3         )

兩個支點做到這一點:

library(dplyr)
library(tidyr) # pivot_*
df2 %>%
  pivot_longer(-id, names_pattern = "(.*?)([0-9]+)", names_to = c(".value", "iter")) %>%
  group_by(id) %>%
  mutate(iter = row_number()) %>%
  pivot_wider(id, names_from = "iter", values_from = c("key", "value"), names_sep = "") %>%
  ungroup()
# # A tibble: 3 x 31
#      id key1  key2  key3  key4  key5  key6  key7  key8  key9  key10 key11 key12 key13 key14 key15 value1 value2 value3 value4 value5 value6 value7 value8 value9 value10 value11 value12 value13 value14 value15
#   <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
# 1     1 <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>      23     45     89    786     10     NA     NA     NA     NA      NA      NA      NA      NA      NA      NA
# 2     2 UJD02 JFF00 <NA>  <NA>  <NA>  UJD05 <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>      NA     NA     NA    670     NA     11     25     89     12      51      NA      NA      NA      NA      NA
# 3     3 UJD05 TPX10 DV071 <NA>  <NA>  KFC10 DR036 UGC12 UEN05 XXA00 DR036 UJD05 JFF00 TPX10 <NA>      45     23    103    987     29     67     NA   6700     67      15       1      78      50      14       3

暫無
暫無

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

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