Recast в R дает другое значение - PullRequest
1 голос
/ 07 мая 2019

У меня есть следующий фрейм данных в R

  DF2<-data.frame("ID"=c("A", "A", "A", "B", "B", "B", "B", 'B'), 
  'Freq'=c(1,2,3,1,2,3,4,5), "Val"=c(1,2,4, 2,3,4,5,8))

Рамка данных имеет следующий вид

   ID Freq Val
1  A    1   1
2  A    2   2
3  A    3   4
4  B    1   2
5  B    2   3
6  B    3   4
7  B    4   5
8  B    5   8

Я хочу растопить и преобразовать кадр данных, чтобы получить следующий кадр данных

   A_Freq A_Value B_Freq B_Value
1      1       1      1       2
2      2       2      2       3
3      3       4      3       4
4     NA      NA      4       5
5     NA      NA      5       8

Я попробовал следующий код

 DF3<-melt(DF2, by=ID)
 DF3$ID<-paste0(DF3$ID, DF3$variable)
 DF3$variable<-NULL
 DF4<-dcast(DF3, value~ID)

Это дает следующий фрейм данных

     value AFreq AVal BFreq BVal
 1     1     1    1     1   NA
 2     2     2    2     2    2
 3     3     3   NA     3    3
 4     4    NA    4     4    4
 5     5    NA   NA     5    5
 6     8    NA   NA    NA    8

Как я могу получить вышеуказанный результат. Я пробовал другие варианты dcast, но не смог получить желаемый результат. попросить кого-нибудь помочь

1 Ответ

1 голос
/ 07 мая 2019

Один вариант будет

library(tidyverse)
DF2 %>% 
    gather(key, val, -ID) %>%
    unite(IDkey, ID, key) %>% 
    group_by(IDkey) %>%
    mutate(rn = row_number()) %>% 
    spread(IDkey, val) %>%
    select(-rn)
# A tibble: 5 x 4
#  A_Freq A_Val B_Freq B_Val
#   <dbl> <dbl>  <dbl> <dbl>
#1      1     1      1     2
#2      2     2      2     3
#3      3     4      3     4
#4     NA    NA      4     5
#5     NA    NA      5     8

Или используя melt/dcast. Мы melt, указав id.var в качестве «ID» (в виде строки) для преобразования из «широкого» в «длинный» формат. Затем, используя dcast, измените форму с 'long' на 'wide' с выражением rowid(ID, variable) ~ paste(ID, variable, sep="_"). rhs из ~ paste значений столбцов вместе, в то время как rowid получает идентификатор последовательности для идентификатора, переменных столбцов.

library(data.table)
dcast(melt(setDT(DF2), id.var = "ID"), rowid(ID, variable) ~ 
     paste(ID, variable, sep="_"))[, ID := NULL][]
#   A_Freq A_Val B_Freq B_Val
#1:      1     1      1     2
#2:      2     2      2     3
#3:      3     4      3     4
#4:     NA    NA      4     5
#5:     NA    NA      5     8

В коде OP выражение является value ~ ID, поэтому он создает столбец 'value' с каждым уникальным элементом 'value' и в то же время автоматически выбирает value.var как 'value', что приводит к больше строк, чем ожидалось

...