大家好。 我在论坛中搜索,但这个“简单”的问题没有成功。 可能已经有类似的问题了吗? 我有以下数据框:
ID<-c(rep(seq(1:5),4))
LAB<-c("A","B","C","A")
datain<-data.frame(cbind(ID,LAB))
我想知道在R中是否存在一个函数来为每个ID获取不带重复的不同值(LAB)?喜欢:
ID<-c(rep(seq(1:5),4))
LAB<-c("A B C")
dataout<-data.frame(cbind(ID,LAB))
dataout
ID LAB
1 1 A B C
2 2 A B C
3 3 A B C
4 4 A B C
5 5 A B C
6 1 A B C
7 2 A B C
8 3 A B C
9 4 A B C
10 5 A B C
11 1 A B C
12 2 A B C
13 3 A B C
14 4 A B C
15 5 A B C
16 1 A B C
17 2 A B C
18 3 A B C
19 4 A B C
20 5 A B C
我很抱歉没有在!!!之前指定输出
一如既往,非常感谢任何帮助!
答案 0 :(得分:2)
您没有指定输出的外观。
有几种选择。这是两个:
aggregate(as.character(LAB) ~ ID, data, c, simplify = FALSE)
# ID as.character(LAB)
# 1 1 A, B, C, A
# 2 2 B, C, A, A
# 3 3 C, A, A, B
# 4 4 A, A, B, C
# 5 5 A, B, C, A
with(data, tapply(as.character(LAB), ID, FUN = c))
# $`1`
# [1] "A" "B" "C" "A"
#
# $`2`
# [1] "B" "C" "A" "A"
#
# $`3`
# [1] "C" "A" "A" "B"
#
# $`4`
# [1] "A" "A" "B" "C"
#
# $`5`
# [1] "A" "B" "C" "A"
如果您碰巧只对“ID”中每个“LAB”的频率感兴趣,您甚至可能对table
感到满意。
table(data)
# LAB
# ID A B C
# 1 2 1 1
# 2 2 1 1
# 3 2 1 1
# 4 2 1 1
# 5 2 1 1
现在您已向我们展示了您希望输出的外观,也许您可以尝试这样:
newout <- merge(datain,
aggregate(as.character(LAB) ~ ID, datain,
function(x) paste(sort(unique(x)), collapse = " "),
simplify = FALSE))
head(newout)
# ID LAB as.character(LAB)
# 1 1 A A B C
# 2 1 B A B C
# 3 1 C A B C
# 4 1 A A B C
# 5 2 A A B C
# 6 2 B A B C
答案 1 :(得分:1)
我认为您正在寻找split
:
with(datain, split(LAB, ID))
# $`1`
# [1] A B C A
# Levels: A B C
#
# $`2`
# [1] B C A A
# Levels: A B C
#
# $`3`
# [1] C A A B
# Levels: A B C
#
# $`4`
# [1] A A B C
# Levels: A B C
#
# $`5`
# [1] A B C A
# Levels: A B C
由于每个ID
可能有不同数量的LAB
s,因此输出是一个列表。
修改:由于现在看来您只需要唯一值,请执行:
with(unique(datain), split(LAB, ID))
如果您不喜欢获取因素,请执行以下操作:
with(unique(datain), split(as.character(LAB), ID))