1
votes

Réalisation d'un bloc de données avec les plus petites valeurs regroupées par colonne

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')


2 commentaires

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]


3 Réponses :


4
votes

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]


1 commentaires

Parfait. Merci!



2
votes

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


0 commentaires

0
votes

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


0 commentaires