Генерация двух столбцов с использованием нескольких столбцов в Tidyverse - PullRequest
0 голосов
/ 18 мая 2019

У меня есть следующие данные:

df<-read.table(text= "Group Time income
A	1	20
 M	3	14
A	2	11
P	2	22
Q	3	21
Q	1	24
M	2	22
P	2	15",h=T)

Я хочу сгенерировать два класса следующим образом:

Время 1 со всеми группами и время 3 только с группами A и M. Это создает столбец«Класс 1»

Время 2 со всеми группами и время 3 только с группами P и Q. Это создает столбец класса 2. Вывод будет:

Group	Time	Income	Class1	Class2
A	1	20	20	11
M	3	14	24	22
A	2	11	14	22
P	2	22		15
Q	3	21		21
Q	1	24		
M	2	22		
P	2	15		

Будучи новичком в R, я не смог найти решение.Любая помощь будет оценена

Ответы [ 2 ]

0 голосов
/ 18 мая 2019

Вот способ получить выходные данные, хотя не ясно, каков разумный порядок значений в Class1 и Class2.

df<-read.table(text= "Group Time income
A   1   20
 M  3   14
A   2   11
P   2   22
Q   3   21
Q   1   24
M   2   22
P   2   15",h=T)

library(tidyverse)
df %>%
  mutate(
    Class1 = (Time == 1) | ((Time == 3) & Group %in% c("A", "M")),
    Class2 = (Time == 2) | ((Time == 3) & Group %in% c("P", "Q"))
  ) %>%
  mutate_at(
    .vars = vars(Class1, Class2),
    .funs = ~ income[.x] %>% `length<-`(length(.x))
  )
#>   Group Time income Class1 Class2
#> 1     A    1     20     20     11
#> 2     M    3     14     14     22
#> 3     A    2     11     24     21
#> 4     P    2     22     NA     22
#> 5     Q    3     21     NA     15
#> 6     Q    1     24     NA     NA
#> 7     M    2     22     NA     NA
#> 8     P    2     15     NA     NA

Создано в 2019-05-17 с помощью пакета представительства (v0.2.1)

0 голосов
/ 18 мая 2019

Это немного неловко, поскольку мы просим dplyr объединяться по позиции, когда кажется, что производные списки больше не соответствуют строкам, к которым мы их присоединяем. Один из способов сделать это - дать rowid каждой строке исходных данных, каждой строке производных списков и left_join на основе этого rowid.

library(dplyr)
Class1 <- df %>%
  filter(Time == 1 | Time == 3 & Group %in% c("A", "M")) %>%
  select(Class1 = income)

Class2 <- df %>%
  filter(Time == 2 | Time == 3 & Group %in% c("P", "Q")) %>%
  select(Class2 = income)

df %>% rowid_to_column() %>%
  left_join(Class1 %>% rowid_to_column(), by = "rowid") %>%
  left_join(Class2 %>% rowid_to_column(), by = "rowid")

  rowid Group Time income Class1 Class2
1     1     A    1     20     20     11
2     2     M    3     14     14     22
3     3     A    2     11     24     21
4     4     P    2     22     NA     22
5     5     Q    3     21     NA     15
6     6     Q    1     24     NA     NA
7     7     M    2     22     NA     NA
8     8     P    2     15     NA     NA

В R NA - это специальное значение, которое является заполнителем для данных, которые не имеют явного значения. Это удобно, когда вы хотите контролировать, включены ли отсутствующие данные или исключены из расчетов. Если это последний шаг в обработке и вы хотите вывести читаемую таблицу, вы можете заменить NA на пустой символ "", но это изменит столбцы данных на символьные данные, что будет неудобно для любых дальнейших вычислений.

...