#r #subset
#r #подмножество
Вопрос:
У меня есть фрейм данных, который выглядит примерно так:
#1 sampleid replication measurement
#2 1 1 0.5
#3 1 2 0.4
#4 1 3 0.3
#5 1 4 0.2
#6 1 5 0.3
#7 2 1 0.5
#8 3 1 0.5
#9 4 1 0.5
#10 4 2 0.3
#11 4 3 0.2
#12 5 1 0.1
Это мой второй день с R, поэтому я прошу прощения, если это довольно простая задача.
Что я хотел бы сделать, так это исключить «измерение» и «sampleid», если соответствующая «репликация» равна <2. Основываясь на приведенном мной примере, я хотел бы видеть исключения в строках # 7, # 8 и # 12.
Я пытался использовать комбинацию subset
и length
, но это не дало того, что мне было нужно. Есть ли простой способ, которого мне не хватает?
Большое спасибо.
Ответ №1:
Мы можем использовать ave
:
subset(dat, ave(replication, sampleid, FUN = length) >= 2)
# sampleid replication measurement
#1 1 1 0.5
#2 1 2 0.4
#3 1 3 0.3
#4 1 4 0.2
#5 1 5 0.3
#8 4 1 0.5
#9 4 2 0.3
#10 4 3 0.2
Данные:
dat <- structure(list(sampleid = c(1L, 1L, 1L, 1L, 1L, 2L, 3L, 4L, 4L,
4L, 5L), replication = c(1L, 2L, 3L, 4L, 5L, 1L, 1L, 1L, 2L,
3L, 1L), measurement = c(0.5, 0.4, 0.3, 0.2, 0.3, 0.5, 0.5, 0.5,
0.3, 0.2, 0.1)), .Names = c("sampleid", "replication", "measurement"
), class = "data.frame", row.names = c(NA, -11L))
Комментарии:
1. Странно! Должно быть, с моей стороны была задержка; ответ не появился как правильный. Исправит! Еще раз спасибо
Ответ №2:
subset(data, sampleid %in% unique(data$sampleid[duplicated(data$sampleid)]))
Комментарии:
1. Спасибо! Действительно ценю помощь.
Ответ №3:
Вариант, использующий dplyr
, является
library(dplyr)
dat %>%
group_by(sampleid) %>%
filter(n() > 1)
# sampleid replication measurement
# <int> <int> <dbl>
#1 1 1 0.5
#2 1 2 0.4
#3 1 3 0.3
#4 1 4 0.2
#5 1 5 0.3
#6 4 1 0.5
#7 4 2 0.3
#8 4 3 0.2
Комментарии:
1. dplyr является одним из пакетов, правильно? Спасибо за помощь.