Поверните фрейм данных и исключите пустые ячейки в r - PullRequest
0 голосов
/ 14 декабря 2018

С учетом фрейма данных dat следующего вида:

    property_id                      tenant count
1              1     Burlington Coat Factory     1
2              1                      Macy's     2
3              1                       Sears     3
4              1                AMC Theatres     4
5              1                 Macy's Home     5
6              2     Burlington Coat Factory     1
7              2                    JCPenney     2
8              2                  Value City     3

Как мы можем получить следующее?

property_id                       X1                      X2                    X3            X4            X5     
1               Burlington Coat Factory                Macy's              Sears            AMC Theatres   Macy's Home  
2               Burlington Coat Factory                JCPenney            Value City       <NA>          <NA>

Расплавление / изменение формы, кажется, дают гигантские в основном разреженные матрицы,

Я очень громоздко использовал следующее, но это ужасно, и я не знаю, как лучше:

df<-data.frame(matrix(NA,1167,20))
df['id']<-unique(dat$property_id)
for(i in seq(1:dim(df)[1])){
  df[i,1:length(subset(dat,dat$property_id==df[i,'id'])$tenant)]<-t(subset(dat,dat$property_id==df[i,'id'])$tenant)
}

1 Ответ

0 голосов
/ 14 декабря 2018

spread, кажется, дает именно то, что вам нужно:

library(tidyverse)
spread(dat, count, tenant)
# A tibble: 2 x 6
#   property_id `1`                     `2`      `3`        `4`          `5`        
#         <dbl> <chr>                   <chr>    <chr>      <chr>        <chr>      
# 1           1 Burlington Coat Factory Macy's   Sears      AMC Theatres Macy's Home
# 2           2 Burlington Coat Factory JCPenney Value City NA           NA         

Другой вариант:

library(reshape2)
dcast(dat, property_id ~ count, value.var = "tenant")
#   property_id                       1        2          3            4           5
# 1           1 Burlington Coat Factory   Macy's      Sears AMC Theatres Macy's Home
# 2           2 Burlington Coat Factory JCPenney Value City         <NA>        <NA>

И наконец:

reshape(dat, v.names = "tenant", idvar = "property_id", timevar = "count", direction = "wide")
#   property_id                tenant.1 tenant.2   tenant.3     tenant.4    tenant.5
# 1           1 Burlington Coat Factory   Macy's      Sears AMC Theatres Macy's Home
# 6           2 Burlington Coat Factory JCPenney Value City         <NA>        <NA>
...