название немного сбивает с толку, но у меня есть набор данных, который выглядит так: head(df)
ID Race Disease
1 8818894 White Hepatitis C - chronic
2 8818894 White Hepatitis C - chronic
3 8421024 White Campylobacteriosis
4 8420854 White Tuberculosis
5 8266841 White Cryptosporidiosis
6 8241742 White Hepatitis B (including delta) - acute
Некоторые идентификаторы дублируются, потому что они оба белые и латиноамериканцы, поэтому это создало наблюдение для обеих их «рас».
Я хотел бы объединить эти идентификаторы и сделать так, чтобы их раса читалась как «белый, латиноамериканец». Есть простой способ сделать это? Я предполагаю, что это будет немного сложно.
Спасибо!
довольно просто: сгруппировать по идентификатору, вставить и свернуть уникальные значения из других столбцов.
пользовательские образцы данных с дубликатом идентификаторов Белые/испаноязычные
library(data.table)
DT <- fread('ID Race Disease
8818894 White "Hepatitis C - chronic"
8818894 Hispanic "Hepatitis C - chronic"
8421024 White "Campylobacteriosis"
8420854 White "Tuberculosis"
8266841 White "Cryptosporidiosis"
8241742 White "Hepatitis B (including delta) - acute"')
# data.table::fread() reads the text directly to a data.tale format. If you
# already have your data in a data.frame, you can convert it using
# data.table::setDT(mydata)
код
DT[, lapply(.SD, function(x) paste0(unique(x), collapse = " & ")), by = .(ID)]
# ID Race Disease
# 1: 8818894 White & Hispanic Hepatitis C - chronic
# 2: 8421024 White Campylobacteriosis
# 3: 8420854 White Tuberculosis
# 4: 8266841 White Cryptosporidiosis
# 5: 8241742 White Hepatitis B (including delta) - acute
объяснение кода
DT
: ваши данные в формате data.table (см. пример кода выше)lapply(...)
: зацикливается на первом элементе, то есть.SD
: все столбцы в ваших данных (которые не включены в
группировка by
-аргумент в конце.
Если вы хотите выбрать только пару столбцов для цикла, вы можете использовать селектор .SDcols
. Подробнее об этом в файле справки от data.table.
Итак, группируем ДТ by
ID. Мы выполняем цикл (lapply
) по каждому столбцу (.SD
), вызываем эту переменную столбца x
(function(x)
) и выполняем следующую функцию:
paste0(unique(x), collapse = " & "))
; это получает все уникальные (unique
) элементы из текущего столбца и вставляет (paste0
) их вместе (collapse
), используя заданный разделитель (" & "
).
Я добавил некоторое объяснение в свой ответ выше.
Привет спасибо за это! Я пытаюсь понять синтаксис здесь, но немного запутался: у меня есть
mydataframe[, lapply(.SD, function(Race) paste0(unique(Race), collapse = " & ")), by = .(ID)]
Извинения за беспокойство!