如何提取重复行并通过特定变量合并它们

How to extract duplicate rows and merge them by certain variable

标题有点混乱,但我有一个看起来像这样的数据集: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

一些 id 是重复的,因为他们既是白人又是西班牙裔,所以它为他们的两个“种族”创建了一个观察结果。

我想合并这些 ID,并将他们的种族读作“西班牙裔白人”。是否有捷径可寻?我想这会有点复杂。

谢谢!

非常简单:按 ID 分组,粘贴并折叠其他列中的唯一值..

具有重复 ID 的自定义示例数据 Whites/Hispanic

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-最后的参数。
如果你只想 select 几个列循环,你可以使用 .SDcols-select 或者。 data.table.

的帮助文件中有更多相关信息

所以,我们对DT by ID进行分组。我们在每一列(.SD)上循环(lapply),调用此列变量xfunction(x))并执行以下功能: paste0(unique(x), collapse = " & "));这会从当前列中获取所有唯一的 (unique) 元素,并使用给定的分隔符 (" & ").[=27] 将它们粘贴 (paste0) 在一起 (collapse) =]