Самый быстрый способ использования условий в цикле for - PullRequest
1 голос
/ 27 марта 2020

То же самое для набора данных birthwt Я хочу, чтобы процент детей с низким весом, которые рождаются от матерей, которые курят и были младше 20 лет на момент рождения. Другими словами, я хочу узнать, сколько <2600 бт (вес) для возраста <20 и курить == 1. </p>

Я запускаю следующие три блока кода, которые фактически дают вам правильный ответ:

 # new df with the conditions
new_df <- subset(birthwt, age<20 & smoke==1)

 #for loop to calculate the low weight

low_weight <- 0
for (i in 1:length(new_df$bwt)){
  if(bwt[i] < 2600){
    low_weight <- low_weight + 1
  }
}

 #low weight for the original dataset
low_weight_tot <- 0
attach(birthwt)
for (i in 1:length(birthwt$bwt)){
  if(bwt[i] < 2600){
    low_weight_tot <- low_weight_tot + 1
  }
}

print(low_weight/low_weight_tot)*100

Но я нахожу это очень утомительным, есть ли другой простой способ сделать это с помощью циклов?

Спасибо!

Ответы [ 4 ]

5 голосов
/ 27 марта 2020

Для этого вам не нужны циклы:

library(dplyr)
birthwt %>% 
  summarise(perc = mean(age < 20 & smoke == 1 & bwt < 2600))
3 голосов
/ 27 марта 2020

Достаточно одного для l oop.

#df contains the birthwt data

lwt_tot <- 0
lwt_2600 <- 0

for(i in 1:nrow(df)){
  lwt_tot <- lwt_tot + 1

  if(df$age[i] < 20 & df$smoke[i] == 1 & df$bwt[i] < 2600){
    lwt_2600 <- lwt_2600 + 1
  }

}

print((lwt_2600/lwt_tot)*100)
#[1] 3.703704
1 голос
/ 27 марта 2020

Я хочу, чтобы процент детей с низкой массой тела, рожденных от матерей, которые курят, и которые были моложе 20 лет на момент рождения

Это предполагает следующий код:

birthwt %>% 
   filter(bwt<2600) %>%
   group_by(`young(<20)`=age<20, smoke) %>%
   summarise(n = n()) %>%
   ungroup() %>%
   mutate(pct=100*n/sum(n)) 

# A tibble: 4 x 4
  `young(<20)` smoke     n   pct
  <lgl>        <int> <int> <dbl>
1 FALSE            0    22  34.9
2 FALSE            1    25  39.7
3 TRUE             0     9  14.3
4 TRUE             1     7  11.1

Последняя строка - это ваш ответ, который совпадает с вашим кодом.

0 голосов
/ 27 марта 2020

В базе R мы можем посчитать количество людей с age < 20 smoke = 1 и bwt < 2600 и разделить его на количество людей с bwt < 2600 в целом.

with(birthwt, sum(age < 20 & smoke == 1 & bwt < 2600)/sum(bwt < 2600)) * 100
#[1] 11.11
...