#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))