Перегруппировать фрейм данных, используя dcast, используя пустышку - PullRequest
0 голосов
/ 28 января 2019

Я хотел бы использовать функцию dcast (пакет reshape2) для возврата измененного фрейма данных, но он не работает.В моем примере:

#Data set
X<-c(804519.4,804519.6,804519.6,804519.4,804519.4,804519.4,804519.6,804519.6,804519.4,804519.4)
Y<-c(7673833,7673833,7673833,7673833,7673833,7673833,7673833,7673833,7673833,7673833)
band<-c("band1","band1","band1","band1","band1","band2","band2","band2","band2","band2")# My original data set are 31 bands
reflec<-c(9.608848,10.504454,8.648237,9.935091,11.282750,9.608848,10.504454,8.648237,9.935091,11.282750)
dummy<-1:10
RES3<-data.frame(X,Y,band,reflec,dummy)
RES3
          X       Y  band    reflec dummy
1  804519.4 7673833 band1  9.608848     1
2  804519.6 7673833 band1 10.504454     2
3  804519.6 7673833 band1  8.648237     3
4  804519.4 7673833 band1  9.935091     4
5  804519.4 7673833 band1 11.282750     5
6  804519.4 7673833 band2  9.608848     6
7  804519.6 7673833 band2 10.504454     7
8  804519.6 7673833 band2  8.648237     8
9  804519.4 7673833 band2  9.935091     9
10 804519.4 7673833 band2 11.282750    10
RES3<-as.data.frame(RES3)
colnames(RES3)<-c("X","Y","band","reflec","dummy")
dcast(RES3, X + Y + dummy ~ band,
         fun.aggregate = length,
         value.var="reflec")

Не работает, мой вывод:

          X       Y dummy band1 band2
1  804519.4 7673833     1     1     0
2  804519.4 7673833     4     1     0
3  804519.4 7673833     5     1     0
4  804519.4 7673833     6     0     1
5  804519.4 7673833     9     0     1
6  804519.4 7673833    10     0     1
7  804519.6 7673833     2     1     0
8  804519.6 7673833     3     1     0
9  804519.6 7673833     7     0     1
10 804519.6 7673833     8     0     1

Я ожидал:

         X       Y    band1    band2      
1 804519.4 7673833    9.608848 9.608848    
2 804519.6 7673833   10.504454 10.504454   
3 804519.6 7673833    8.648237  8.648237   
4 804519.4 7673833    9.935091  9.935091   
5 804519.4 7673833   11.282750 11.282750   

Любой участник может помочь мне, потому чтомой исходный набор данных состоит из 31 полос как уровней, и я хотел бы преобразовать их в столбцы?Спасибо!

Ответы [ 3 ]

0 голосов
/ 28 января 2019
RES4<-dcast(RES3, ... ~ band,
            value.var="reflec")
0 голосов
/ 28 января 2019

Как я уже говорил, reshape2 был устарел в пользу tidyr в пакетах tidyverse.По моему мнению (и мнению авторов пакетов), tidyr spread и gather немного более ясны, чем reshape2 cast и melt - нет формульной записи, более понятные способыуказать значения.(Некоторый контекст для этого здесь ).

Также, как я упоминал, у вас есть пара дополнительных строк - data.frame добавит имена столбцов в соответствии с именами вектороввдаваясь в это.

Я обновил этот ответ, чтобы он соответствовал новым опубликованным вами данным.Мое оригинальное решение сработало для ваших исходных данных, но мне нужно еще несколько шагов для ваших новых данных, которые я делаю с функциями dplyr.

В данный момент я не получаю полностью столбец dummy, поскольку это не в вашем ожидаемом результате.Я бросаю это с dplyr::select(-dummy).Одна сложность, связанная с tidyr::spread, заключается в том, что вам нужен какой-то способ уникальной маркировки строк - это раздражает, но также предотвращает ошибки при изменении формы данных.Поэтому я группирую по band, затем добавляю номера строк следующим образом:

library(tidyr)
library(dplyr)

res3 <- data.frame(X, Y, band, reflec, dummy)

res3 %>%
  select(-dummy) %>%
  group_by(band) %>%
  mutate(row = row_number())
#> # A tibble: 10 x 5
#> # Groups:   band [2]
#>          X       Y band  reflec   row
#>      <dbl>   <dbl> <fct>  <dbl> <int>
#>  1 804519. 7673833 band1   9.61     1
#>  2 804520. 7673833 band1  10.5      2
#>  3 804520. 7673833 band1   8.65     3
#>  4 804519. 7673833 band1   9.94     4
#>  5 804519. 7673833 band1  11.3      5
#>  6 804519. 7673833 band2   9.61     1
#>  7 804520. 7673833 band2  10.5      2
#>  8 804520. 7673833 band2   8.65     3
#>  9 804519. 7673833 band2   9.94     4
#> 10 804519. 7673833 band2  11.3      5

Таким образом, строка 1 будет иметь значение диапазона 1 и значение диапазона 2, и так далее.Затем я вызываю spread с полосой в качестве ключа, чтобы стать столбцами, и значения отражений, чтобы заполнить эти столбцы, и, наконец, отбрасываю столбец с номером строки.

res3 %>%
  select(-dummy) %>%
  group_by(band) %>%
  mutate(row = row_number()) %>%
  spread(key = band, value = reflec) %>%
  select(-row)
#> # A tibble: 5 x 4
#>         X       Y band1 band2
#>     <dbl>   <dbl> <dbl> <dbl>
#> 1 804519. 7673833  9.61  9.61
#> 2 804519. 7673833  9.94  9.94
#> 3 804519. 7673833 11.3  11.3 
#> 4 804520. 7673833 10.5  10.5 
#> 5 804520. 7673833  8.65  8.65

Создано в 2019-01-28 представителем пакета (v0.2.1)

0 голосов
/ 28 января 2019

value.var должна быть строкой, которая указывает имя столбца.В соответствии с ?dcast

value.var - имя столбца, в котором хранятся значения

, а name столбца - строка символов

.он без кавычек, он ищет имя столбца из значений

dcast(RES3, X + Y + dummy ~ band,
         fun.aggregate = length,
         value.var="reflec")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...