sacar - paquete sampling en r
Filtrar las observaciones presentes en pares específicos de muestras en R (3)
Podemos crear un grupo eliminando el último carácter en ''muestra'' y luego filter
función del número de ''observación'' única; es decir, si la length
es mayor que 1, lo guardamos
library(dplyr)
df2 %>%
group_by(grp = sub("[A-Z]$", "", sample)) %>%
filter(n_distinct(observation)>1) %>%
ungroup() %>%
select(-grp)
# A tibble: 4 x 2
# sample observation
# <chr> <int>
#1 sample1A 5
#2 sample1B 7
#3 sample3A 10
#4 sample3B 5
datos
df2 <- structure(list(sample = c("sample1A", "sample1B", "sample2A",
"sample2B", "sample3A", "sample3B"), observation = c(5L, 7L,
10L, 10L, 10L, 5L)), .Names = c("sample", "observation"),
class = "data.frame", row.names = c(NA, -6L))
Tengo una lista de observaciones asociadas con muestras. Me gustaría eliminar las observaciones idénticas que ocurren en pares específicos de muestras.
ejemplo de datos:
sample observation
sample1A 5
sample1B 7
sample2A 10
sample2B 10
sample3A 10
sample3B 5
Entonces, la idea sería agrupar las muestras en pares en función de las letras A y B, y luego para cada uno de estos pares eliminar las filas con observaciones coincidentes.
En el caso anterior, solo se excluirán las observaciones de la muestra 2A y la muestra 2B, ya que son de la misma muestra, la muestra 2, se tomaron muestras en dos ocasiones distintas (muestra 2A y muestra 2B). La salida se vería así:
sample observation
sample1A 5
sample1B 7
sample3A 10
sample3B 5
Si es posible hacer esto usando DPLYR sería de mucha utilidad, ya que estoy tratando de mejorar mi competencia con él.
Imagino que usar group_by () para ordenar los datos en grupos basados en los nombres de las muestras y luego usar filter () podría funcionar, pero no estoy seguro de cómo manejar los condicionales anidados del primer emparejamiento basado en una expresión regular o cadena, luego filtrando buscando valores coincidentes entre filas.
Gracias de antemano por tu ayuda.
Si su formato es así de regular, también puede hacer esto:
df %>% filter(matrix(.$observation,2) %>% {.[1,]!=.[2,]} %>% rep(each=2))
con solo base, y tan corto como pude:
df[rep(!!diff(matrix(df[[2]],2)),each=2),]
# sample observation
# 1 sample1A 5
# 2 sample1B 7
# 5 sample3A 10
# 6 sample3B 5
Una solución en base con un bucle.
# create data
dat <- c(5,7,10,10,10,5)
names(dat) <- c(''sample1A'', ''sample1B'', ''sample2A'', ''sample2B'', ''sample3A'', ''sample3B'')
dat
# lets go
pairs <- substr(names(dat), 1, nchar(names(dat))-1)
single <- unique(pairs)
new_dat <- NULL
for(i in 1:length(single)){
pos <- pairs == single[i]
if(!any(duplicated(dat[pos]))){
new_dat <- c(new_dat, dat[pos])
}
}
new_dat