1

嗨,所有社区。我在论坛中搜索,但没有成功找到这个“简单”的问题。可能已经有类似的问题了?我有以下数据框:

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

我很抱歉之前没有指定输出!!!

一如既往,非常感谢任何帮助!

4

2 回答 2

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"

table如果您碰巧只对“ID”中的每个“LAB”的频率感兴趣,您甚至可能对此感到满意。

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
于 2013-02-07T18:05:26.720 回答
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可能有不同数量的LABs,因此输出是一个列表。

编辑:由于现在看来您只需要唯一值,请执行以下操作:

with(unique(datain), split(LAB, ID))

如果您不喜欢获取因子,请执行以下操作:

with(unique(datain), split(as.character(LAB), ID))
于 2013-02-07T18:03:33.260 回答