una sacar paquete muestras muestra libreria generar filas eliminar aleatorias r filter dplyr

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