Mam zbiór danych o nazwie bwght, który zawiera zmienną cigs (papierosy wypalane dziennie)

Kiedy obliczam średnią cigs w zbiorze danych bwght przy użyciu: mean(bwght$cigs), otrzymuję numer 2.08.

Tylko 212 z 1388 kobiet w próbce pali (a 1176 nie pali):

summary(bwght$cigs>0) daje wynik:

Mode      FALSE    TRUE    NA's 
logical    1176     212       0

Zostałem poproszony o znalezienie średniej cigs wśród palących kobiet (212).

Mam trudności ze znalezieniem odpowiedniej składni do wykluczenia osób niepalących = 0 Próbowałem:

  • mean(bwght$cigs| bwght$cigs>0)

  • mean(bwght$cigs>0 | bwght$cigs=TRUE)

  • jeśli (bwght$cigs > 0){ suma (masa $ papierosy) }

  • x <-as.numeric(bwght$cigs, rm="0"); średnia(x)

Ale wydaje się, że nic nie działa! Czy ktoś może mi pomóc?

6
user1626092 23 wrzesień 2012, 22:43
1
Ponownie oznaczyłem Twoje pytanie jako pytanie R, co pomoże mu uzyskać dodatkową uwagę. Napiszę teraz dla ciebie odpowiedź.
 – 
TARehman
25 wrzesień 2012, 20:39

2 odpowiedzi

Najlepsza odpowiedź

Jeśli chcesz wykluczyć osoby niepalące, masz kilka opcji. Najłatwiej jest chyba tak:

mean(bwght[bwght$cigs>0,"cigs"])

W przypadku ramki danych pierwszą zmienną jest wiersz, a następną kolumną. Możesz więc podzbiór używając dataframe[1,2], aby uzyskać pierwszy wiersz, drugą kolumnę. Możesz również użyć logiki w wyborze wiersza. Używając bwght$cigs>0 jako pierwszego elementu, tworzysz podzbiór, aby mieć tylko te wiersze, w których cigs nie jest zerem.

Twoje pozostałe nie działały z następujących powodów:

mean(bwght$cigs| bwght$cigs>0)

To jest właściwie logiczne porównanie. Pytasz o wynik PRAWDA / FAŁSZ bwght$cigs OR bwght$cigs>0, a następnie bierzesz z niego średnią. Nie jestem do końca pewien, ale myślę, że R nie może nawet przyjąć danych wpisanych jako logiczne dla funkcji mean().

mean(bwght$cigs>0 | bwght$cigs=TRUE)

Taki sam problem. Używasz znaku |, który zwraca logikę, a R próbuje przyjąć średnią logiki.

if(bwght$cigs > 0){sum(bwght$cigs)}

Czy byłeś przypadkiem pierwotnie programistą SAS? Wygląda to tak, jak na początku pisałem. Zasadniczo if() nie działa tak samo w R, jak w SAS. W tym przykładzie używasz bwght$cigs > 0 jako warunku if, który nie zadziała, ponieważ R będzie patrzeć tylko na pierwszy element wektora wynikający z bwght$cigs > 0. R obsługuje pętle inaczej niż SAS - sprawdź funkcje takie jak lapply, tapply i tak dalej.

x <-as.numeric(bwght$cigs, rm="0")
mean(x)

Szczerze nie wiem, co by to zrobiło. Może zadziałać, jeśli rm="0" nie ma cudzysłowów...?

13
TARehman 25 wrzesień 2012, 20:48
Bardzo dziękuję za odpowiedź! Pomogło to w moim problemie!!
 – 
user1626092
18 październik 2012, 13:13
mean(bwght[bwght$cigs>0,"cigs"])

Zauważyłem, że instrukcja nie powiodła się, zwracając „argument nie jest liczbowy ani logiczny: zwracanie NA”

Konwersja na macierz rozwiązała ten problem:

mean(data.matrix(bwght[bwght$cigs>0,"cigs"]))
1
Grant 15 marzec 2018, 06:56