Comment puis-je créer un nouveau bloc de données avec le plus petit groupe de valeurs par colonne.
Par exemple, ce df:
> test Gene Value 1: A 10 2: B 3 3: C 1 4: D 4
Maintenant avec:
> test Gene Value 1: A 10 2: B 0 3: C 1 4: D 0
J'obtiens ceci:
test <- setDT(df)[, .SD[which.min(Value)], by=Gene]
Mais comment puis-je utiliser une deuxième condition pour Valeur> 0 ici? Je veux avoir cette sortie:
df <- read.table(header = TRUE, text = 'Gene Value A 12 A 10 B 3 B 0 B 6 C 1 D 0 D 4')
3 Réponses :
Pourrait faire:
Gene Value 1: A 10 2: B 3 3: C 1 4: D 4
Sortie:
setDT(df)[, .(Value = min(Value[Value > 0])), by=Gene]
Parfait. Merci!
En utilisant tidyverse , vous pouvez grouper, filtrer puis résumer la valeur minimale:
library(tidyverse) df2 <- df %>% group_by(Gene) %>% filter(Value != 0) %>% summarise(Value = min(Value)) # A tibble: 4 x 2 Gene Value <fct> <dbl> 1 A 10 2 B 3 3 C 1 4 D 4
Utilisation de l ' agrégat de la base R
aggregate(Value ~ Gene, subset(df, Value > 0), min) # Gene Value #1 A 10 #2 B 3 #3 C 1 #4 D 4
Voulez-vous utiliser les lignes avec des zéros? Si non, pourquoi ne supprimez-vous pas simplement le thème au préalable?
Essayez
setDT (df) [Value> 0, .SD [which.min (Value)], by = Gene]