Mam ramkę danych:

SampleName <- c(A,A,A,A,B)
NumberofSample <- c(1,2,3,1,4)
SampleResult <- c(3,6,12,12,14)

Data <- data.frame(SampleName,NumberofSample,SampleResult)
head(Data)

SampleName NumberofSample SampleResult
1 A 1  3
2 A 2  6
3 A 3 12
4 A 1 12
4 B 4 14

Moim pomysłem jest: Kiedy SamplereSult <15 && SamplereSult> 5, przykład A ma 6 próbek, które pasują do stanu, a próbka B ma 4 próbki, które pasują do niego. Więc idealne wyniki wyglądałyby tak:

SampleName Frequency
1 A 6
2 B 4

Piszę coś takiego:

D1<- aggregate(SampleResult~SampleName, Data, function(x)sum(x<15 && x>5))

Ale czuję, że brak czegoś podobnego

x * Data$NumberofSample[x]

Więc moje pytanie jest właściwe sposobem do kodu? Dziękuję Ci

r
3
YUXUAN XIE 4 czerwiec 2018, 21:21

3 odpowiedzi

Najlepsza odpowiedź

Możemy użyć dplyr. Zgrupowany przez "samplename", podzbiór "Numberofsample", który spełnia warunek oparty na "SamplereSult" i zdobądź sum

library(dplyr)
Data %>%
     group_by(SampleName) %>% 
     summarise(Frequency = sum(NumberofSample[SampleResult < 15 & 
              SampleResult > 5]))
# A tibble: 2 x 2
#  SampleName Frequency
#  <chr>          <int>
#1 A                  6
#2 B                  4

Jeśli preferujemy aggregate

aggregate(cbind(Frequency = NumberofSample * (SampleResult < 15 & 
          SampleResult > 5)) ~ SampleName, Data, sum)
#   SampleName Frequency
#1          A         6
#2          B         4

Należy pamiętać, że wyjście && jest jedną wartością prawdziwą / fałszywą

(1:3 > 1) && (2:4 > 2)

Zamiast logicznego wektora tej samej długości

2
akrun 4 czerwiec 2018, 18:32

Rozwiązanie AKRUN jest spotkań. Zdarza się jednak, że {DPLYR} oferuje funkcję wygody dla tego rodzaju obliczeń: count.

W swojej najczęstszej formie liczy liczbę wierszy w każdej grupie. Jednak może również wykonywać sumę ważoną iw twoim przypadku po prostu masy, czy SampleResult jest między wybranymi granicami:

Data %>% count(
    SampleName,
    wt = NumberofSample[SampleResult > 5 & SampleResult < 15]
)
2
Konrad Rudolph 4 czerwiec 2018, 18:42

Może następująca forma aggregate jest prostsza. I podzbiór Data na podstawie stanu, który chcesz, a następnie weź length każdej grupy.

inx <- with(Data, 5 < SampleResult & SampleResult < 15)
aggregate(SampleResult ~ SampleName, Data[inx, ], length)
#SampleName SampleResult
#1          A            3
#2          B            1

Kolejna możliwość byłaby

subData <- subset(Data, 5 < SampleResult & SampleResult < 15)
aggregate(SampleResult ~ SampleName, subData, length)

Ale myślę, że rozwiązanie wskaźnika logicznego jest lepsze, ponieważ jego użycie pamięci jest mniejsze.

1
Rui Barradas 4 czerwiec 2018, 18:44