Как получить несколько возвратов из одной переменной?

Привет всему сообществу. Я ищу на форуме, но безуспешно по этому "легкому" вопросу. Может быть, уже есть подобный вопрос? У меня есть следующий фрейм данных:

ID<-c(rep(seq(1:5),4))
LAB<-c("A","B","C","A")
datain<-data.frame(cbind(ID,LAB))

Я хотел бы знать, если существует функция в R, чтобы получить для каждого идентификатора различные значения (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

Приношу свои извинения за то, что не указал конкретный результат раньше!!!

Как всегда, любая помощь очень ценится!

2 ответа

Решение

Я думаю, что вы ищете 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))

Вы не указываете, как вы хотите, чтобы ваш вывод выглядел.

Есть несколько вариантов. Вот два:

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, если вам случается интересоваться только частотой каждого "LAB" по "ID".

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
Другие вопросы по тегам