Как получить несколько возвратов из одной переменной?
Привет всему сообществу. Я ищу на форуме, но безуспешно по этому "легкому" вопросу. Может быть, уже есть подобный вопрос? У меня есть следующий фрейм данных:
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
может иметь другое количество LAB
s, вывод является списком.
Изменить: так как теперь кажется, что вы хотели только уникальные значения, выполните:
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