【发布时间】:2020-07-26 17:38:32
【问题描述】:
我有一个包含 ID 和其他列的表。我想按 Id 对数据进行分组并获取所有列的唯一值。
从上面的表格中按 ID 分组并获得唯一的(Alt1,Alt2,Alt3)
结果应该是矢量形式
A -> 1,2,3,5
B ->1,3,4,5,7
【问题讨论】:
标签: r dplyr data.table tidyr
我有一个包含 ID 和其他列的表。我想按 Id 对数据进行分组并获取所有列的唯一值。
从上面的表格中按 ID 分组并获得唯一的(Alt1,Alt2,Alt3)
结果应该是矢量形式
A -> 1,2,3,5
B ->1,3,4,5,7
【问题讨论】:
标签: r dplyr data.table tidyr
我们可以获取长格式的数据,并为每个 ID 创建一个 unique 值列表。
library(dplyr)
library(tidyr)
df1 <- df %>%
pivot_longer(cols = -ID) %>%
group_by(ID) %>%
summarise(value = list(unique(value))) %>%
unnest(value)
df1
# ID value
# <fct> <dbl>
# 1 A 1
# 2 A 3
# 3 A 2
# 4 A 5
# 5 B 1
# 6 B 4
# 7 B 5
# 8 B 3
# 9 B 6
#10 B 7
如果需要,我们可以使用split 将其存储为列表。
split(df1$value, df1$ID)
#$A
#[1] 1 3 2 5
#$B
#[1] 1 4 5 3 6 7
data.table 相当于上述内容:
library(Data.table)
setDT(df)
df2 <- melt(df, id.vars = 'ID')[, .(value = list(unique(value))), ID]
df2$value 中存在唯一值作为向量。
数据
df <- data.frame(ID = c('A', 'A', 'B', 'B'),
Alt1 = c(1, 2, 1, 3),
Alt2 = c(3, 5, 4, 6),
Alt3 = c(1, 3, 5, 7))
【讨论】:
value 已经是一个列表。可能你的意思是长格式,在这种情况下做df2[, .(value = unlist(value)), ID]