如何提取重复行并通过特定变量合并它们
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
),调用此列变量x
(function(x)
)并执行以下功能:
paste0(unique(x), collapse = " & "))
;这会从当前列中获取所有唯一的 (unique
) 元素,并使用给定的分隔符 (" & "
).[=27] 将它们粘贴 (paste0
) 在一起 (collapse
) =]
标题有点混乱,但我有一个看起来像这样的数据集: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
),调用此列变量x
(function(x)
)并执行以下功能:
paste0(unique(x), collapse = " & "))
;这会从当前列中获取所有唯一的 (unique
) 元素,并使用给定的分隔符 (" & "
).[=27] 将它们粘贴 (paste0
) 在一起 (collapse
) =]