приведение / распространение 2 столбцов на основе одного общего фактора - PullRequest
0 голосов
/ 29 мая 2020

Я борюсь с этим - извините. Это у меня есть:

library(dplyr)
library(reshape2)

haves <- data.frame(
    id = c(1, 1, 1, 1, 1)
    , factor1 = c("f1", "f1", "f1", "f1", "f1")
    , factor2 = c("f2", "f2", "f2", "f2", "f2")
    , number_1 = c(1,2,3,10,11)
    , number_2 = c(43,44,45,52,53)
    , age = c(2, 2, 2, 9, 9)
    , date1 = c(as.Date("2014-07-01"), as.Date("2014-07-01"), as.Date("2014-07-01"), as.Date("2015-02-01"), as.Date("2015-02-01"))
    , y = c(554.5, 554.5, 554.5, 616, 616)
    , x = c(2,1,0,3,0)
)

haves

  id factor1 factor2 number_1 number_2 age      date1     y x
1  1      f1      f2        1       43   2 2014-07-01 554.5 2
2  1      f1      f2        2       44   2 2014-07-01 554.5 1
3  1      f1      f2        3       45   2 2014-07-01 616.0 0
4  1      f1      f2       10       52   9 2015-02-01 616.0 3
5  1      f1      f2       11       53   9 2015-02-01 616.0 0

Я хочу преобразовать / распределить значения в number_1 и number_2 в соответствии с x, чтобы получить следующее:

enter image description here

Ответы [ 2 ]

2 голосов
/ 29 мая 2020

Для полноты, вот решение, использующее dcast():

library(data.table)
dcast(setDT(haves), ... ~ x, value.var = paste0("number_", 1:2), fill = 0)
   id factor1 factor2 age      date1     y number_1_0 number_1_1 number_1_2 number_1_3 number_2_0 number_2_1
1:  1      f1      f2   2 2014-07-01 554.5          3          2          1          0         45         44
2:  1      f1      f2   9 2015-02-01 616.0         11          0          0         10         53          0
   number_2_2 number_2_3
1:         43          0
2:          0         52

pivot_wider() также имеет параметр для заполнения отсутствующих значений. Таким образом, нет необходимости в отдельном вызове replace(is.na(.), 0):

library(tidyr)
haves %>%
  pivot_wider(names_from = x, values_from = starts_with("number_"), values_fill = 0)
# A tibble: 2 x 14
     id factor1 factor2   age date1          y number_1_2 number_1_1 number_1_0 number_1_3 number_2_2 number_2_1
  <dbl> <chr>   <chr>   <dbl> <date>     <dbl>      <dbl>      <dbl>      <dbl>      <dbl>      <dbl>      <dbl>
1     1 f1      f2          2 2014-07-01  554.          1          2          3          0         43         44
2     1 f1      f2          9 2015-02-01  616           0          0         11         10          0          0
# ... with 2 more variables: number_2_0 <dbl>, number_2_3 <dbl>

Обратите внимание, что порядок столбцов после изменения формы отличается. В то время как dcast() упорядочивает столбцы по значению x, т.е. 0, 1, 2, 3, pivot_wider() упорядочивает столбцы по внешнему виду, то есть 2, 1, 0, 3.

2 голосов
/ 29 мая 2020

Думаю, вы ищете решение pivot_wider:

library(tidyr)

haves %>%
  pivot_wider(names_from = x, values_from = starts_with("number_"), values_fill = 0)

дает вам

# A tibble: 2 x 14
     id factor1 factor2   age date1          y number_1_2 number_1_1 number_1_0 number_1_3 number_2_2 number_2_1 number_2_0
  <dbl> <fct>   <fct>   <dbl> <date>     <dbl>      <dbl>      <dbl>      <dbl>      <dbl>      <dbl>      <dbl>      <dbl>
1     1 f1      f2          2 2014-07-01  554.          1          2          3          0         43         44         45
2     1 f1      f2          9 2015-02-01  616           0          0         11         10          0          0         53
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...