Изменение данных R с использованием dplyr - PullRequest
0 голосов
/ 24 октября 2019

У меня есть эти данные:

library(dplyr)

df1 <- tibble(
  type = c("Animals", "Animals", "People", "People"),
  type_group = c("Dogs", "Cats", "John", "Jane"),
  analysis1 = c(32.7, 67.5, 34.6, 56.5),
  analysis2 = c(23.7, 89.4, 45.8, 98.6),
  analysis3 = c(45.7, 45.7, 23.6, 23.6),
  analysis4 = c(14.4, 45.4, 98.0, 12.2))

Я хотел бы добавить несколько новых строк к данным, чтобы они выглядели так:

df2 <- tibble(
  type = c("Animals", "Animals", "Animals diff", "People", "People", "People diff"),
  type_group = c("Dogs", "Cats", "Dogs and cats" ,"John", "Jane", "John and Jane"),
  analysis1 = c(32.7, 67.5, 34.8, 34.6, 56.5, 21.9),
  analysis2 = c(23.7, 89.4, 65.7, 45.8, 98.6, 52.8),
  analysis3 = c(45.7, 45.7, 0.0,  23.6, 23.6, 0.0),
  analysis4 = c(14.4, 45.4, 31.0, 98.0, 12.2, 85.8))

Новые строки озаглавлены 'Animals diff ', то есть фигуры кошек минус фигура собак. Точно так же есть новый ряд, который называется «Разница в людях», то есть цифры Джейн минус цифры Джона.

Я знаю, что простой способ сделать это - использовать dplyr, добавить новые строки в качестве переменных и сделать данные шире, а не длиннее. Однако этот формат не будет работать для того, что я хочу сделать с данными. В частности, он должен быть в этом более длинном формате, как показано в df2.

Я подумал, что могу создать переменные, используя mutate в dplyr, чтобы сделать данные шире, а затем использовать reshape, чтобы сделать данные длинными, но после игры я не могу думатькак это сделать. Любые идеи о том, как я могу добраться до df2?

Спасибо

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

Думаю, мне удалось ответить на это, предложив rbind.

rbind(df1,c("People diff","John and Jane", 
        df1$analysis1[df1$type_group == 'John'] - df1$analysis1[df1$type_group == 'Jane'],
        df1$analysis2[df1$type_group == 'John'] - df1$analysis2[df1$type_group == 'Jane'],
        df1$analysis3[df1$type_group == 'John'] - df1$analysis3[df1$type_group == 'Jane'],
        df1$analysis4[df1$type_group == 'John'] - df1$analysis4[df1$type_group == 'Jane'])) -> jj

rbind(df1,c("Animals diff","Dogs and cats", 
        df1$analysis1[df1$type_group == 'Cats'] - df1$analysis1[df1$type_group == 
'Dogs'],
        df1$analysis2[df1$type_group == 'Cats'] - df1$analysis2[df1$type_group == 
'Dogs'],
        df1$analysis3[df1$type_group == 'Cats'] - df1$analysis3[df1$type_group == 
'Dogs'],
        df1$analysis4[df1$type_group == 'Cats'] - df1$analysis4[df1$type_group == 
'Dogs'])) -> c_d

rbind(jj, c_d)


# A tibble: 10 x 6
  type         type_group    analysis1 analysis2 analysis3 analysis4
<chr>        <chr>         <chr>     <chr>     <chr>     <chr>    
1 Animals      Dogs          32.7      23.7      45.7      14.4     
2 Animals      Cats          67.5      89.4      45.7      45.4     
3 People       John          34.6      45.8      23.6      98       
4 People       Jane          56.5      98.6      23.6      12.2     
5 People diff  John and Jane -21.9     -52.8     0         85.8     
6 Animals      Dogs          32.7      23.7      45.7      14.4     
7 Animals      Cats          67.5      89.4      45.7      45.4     
8 People       John          34.6      45.8      23.6      98       
9 People       Jane          56.5      98.6      23.6      12.2     
10 Animals diff Dogs and cats 34.8      65.7      0         31
0 голосов
/ 24 октября 2019

rbind не смог добиться цели?

> rbind(df1,c("People",'Me',1,2,3,4))
# A tibble: 5 x 6
  type    type_group analysis1 analysis2 analysis3 analysis4
  <chr>   <chr>      <chr>     <chr>     <chr>     <chr>    
1 Animals Dogs       32.7      23.7      45.7      14.4     
2 Animals Cats       67.5      89.4      45.7      45.4     
3 People  John       34.6      45.8      23.6      98       
4 People  Jane       56.5      98.6      23.6      12.2     
5 People  Me         1         2         3         4        

Сделайте это для каждой новой строки или создайте тиббл с новыми строками, которые нужно добавить и связать оба тиббла одинаково.

> rbind(df1,df2)
# A tibble: 10 x 6
   type         type_group    analysis1 analysis2 analysis3 analysis4
   <chr>        <chr>             <dbl>     <dbl>     <dbl>     <dbl>
 1 Animals      Dogs               32.7      23.7      45.7      14.4
 2 Animals      Cats               67.5      89.4      45.7      45.4
 3 People       John               34.6      45.8      23.6      98  
 4 People       Jane               56.5      98.6      23.6      12.2
 5 Animals      Dogs               32.7      23.7      45.7      14.4
 6 Animals      Cats               67.5      89.4      45.7      45.4
 7 Animals diff Dogs and cats      34.8      65.7       0        31  
 8 People       John               34.6      45.8      23.6      98  
 9 People       Jane               56.5      98.6      23.6      12.2
10 People diff  John and Jane      21.9      52.8       0        85.8

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...