сворачивание значений столбцов в определенном порядке и оставление недостающих значений как NA в R

#r #collapse

#r #агрегат

Вопрос:

Я использую R.

У меня 4 разные базы данных. У каждого из них есть значения для моих переменных. Некоторые базы имеют больше значений, чем другие. Поэтому я хочу использовать сначала тот, который имеет наибольшее количество значений, и, наконец, тот, который имеет наименьшие значения. Данные выглядят следующим образом…

 Variables   A   B   C   D

John        2   4   
Mike            6
Walter          7
Jennifer        9   8
Amanda      3
Carlos      9
Michael         3
James                   5
Kevin       4
Dennis              7
Frank
Steven
Joseph
Elvis           2
Maria           1
  

Итак, для того, чтобы заполнить данные a, необходимо создать новый столбец, который сначала использует данные столбца B, поскольку он содержит наибольшее количество значений, затем A, затем C и затем D, а те, которые отсутствуют, должны быть NA. Также мне нужно добавить еще один столбец, который дает мне ссылку на данные. Другими словами, если я использую столбец B для столбца John, мне нужен столбец, который сообщает мне, что данные относятся к столбцу B.

Столбец должен выглядеть следующим образом…

 Variables   E   D

John        4   B
Mike        6   B
Walter      7   B
Jennifer    9   B
Amanda      3   A
Carlos      9   A
Michael     3   B
James       5   D
Kevin       4   A
Dennis      7   C
Frank       NA  NA
Steven      NA  NA
Joseph      NA  NA
Elvis       2   B
Maria       1   B
  

Ответ №1:

С tidyverse помощью вы можете сделать следующее…

Используется pivot_longer для перевода в длинную форму. Сделайте name ordered множитель через «B», «A», «C» и «D». Затем, когда вы arrange , вы можете получить первое значение по этому порядку в имени каждого пользователя.

Это предполагает, что ваши недостающие данные NA . Если вместо этого они являются пустыми символьными значениями, вы можете filter использовать их filter(value != "") вместо drop_na(value) .

 library(tidyverse)

df %>%
  pivot_longer(cols = -Variables) %>%
  mutate(name = ordered(name, levels = c('B', 'A', 'C', 'D'))) %>%
  group_by(Variables) %>%
  drop_na(value) %>%
  arrange(name) %>%
  summarise(E = first(value),
            New_D = first(name)) %>%
  right_join(df)
  

Вывод

    Variables     E New_D     A     B     C     D
   <chr>     <dbl> <ord> <dbl> <dbl> <dbl> <dbl>
 1 Amanda        3 A         3    NA    NA    NA
 2 Carlos        9 A         9    NA    NA    NA
 3 Dennis        7 C        NA    NA     7    NA
 4 Elvis         2 B        NA     2    NA    NA
 5 James         5 D        NA    NA    NA     5
 6 Jennifer      9 B        NA     9     8    NA
 7 John          4 B         2     4    NA    NA
 8 Kevin         4 A         4    NA    NA    NA
 9 Maria         1 B        NA     1    NA    NA
10 Michael       3 B        NA     3    NA    NA
11 Mike          6 B        NA     6    NA    NA
12 Walter        7 B        NA     7    NA    NA
13 Frank        NA NA       NA    NA    NA    NA
14 Steven       NA NA       NA    NA    NA    NA
15 Joseph       NA NA       NA    NA    NA    NA
  

Данные

 df <- structure(list(Variables = c("John", "Mike", "Walter", "Jennifer", 
"Amanda", "Carlos", "Michael", "James", "Kevin", "Dennis", "Frank", 
"Steven", "Joseph", "Elvis", "Maria"), A = c(2, NA, NA, NA, 3, 
9, NA, NA, 4, NA, NA, NA, NA, NA, NA), B = c(4, 6, 7, 9, NA, 
NA, 3, NA, NA, NA, NA, NA, NA, 2, 1), C = c(NA, NA, NA, 8, NA, 
NA, NA, NA, NA, 7, NA, NA, NA, NA, NA), D = c(NA, NA, NA, NA, 
NA, NA, NA, 5, NA, NA, NA, NA, NA, NA, NA)), class = "data.frame", row.names = c(NA, 
-15L))