R Loop для создания новых векторов - PullRequest
1 голос
/ 31 мая 2019
data = data.frame("id"=c(1,2,3,4,5,6,7,8,9,10),
                  "group"=c(1,1,2,1,2,2,2,2,1,2),
                  "type"=c(1,1,2,3,2,2,3,3,3,1),
                  "score1"=c(sample(1:4,10,r=T)),
                  "score2"=c(sample(1:4,10,r=T)),
                  "score3"=c(sample(1:4,10,r=T)),
                  "score4"=c(sample(1:4,10,r=T)),
                  "score5"=c(sample(1:4,10,r=T)),
                  "weight1"=c(173,109,136,189,186,146,173,102,178,174),
                  "weight2"=c(147,187,125,126,120,165,142,129,144,197),
                  "weight3"=c(103,192,102,159,128,179,195,193,135,145),
                  "weight4"=c(114,182,199,101,111,116,198,123,119,181),
                  "weight5"=c(159,125,104,171,166,154,197,124,180,154))

Это образец моих данных. Я хочу, чтобы взвешенные по населению подсчеты переменной оценки были такими:

count(data, score1, wt = weight1)
count(data, score2, wt = weight2)
count(data, score3, wt = weight3)
count(data, score4, wt = weight4)
count(data, score5, wt = weight5)

Однако я стремлюсь сделать цикл такого типа, чтобы я мог сделать это для каждой комбинации 'group' и 'type' для показателей 1-5 и сохранить их в отдельных векторах, так что

vec1 = weighted score variable for scores1-5 for group = 1 and type = 1
vec2 = weighted score variable for scores1-5 for group = 1 and type = 2
vec3 = weighted score variable for scores1-5 for group = 1 and type = 3

и т. Д. И т. П.

Ответы [ 2 ]

1 голос
/ 31 мая 2019

Мы можем использовать map для циклического прохождения каждого из соответствующих 'показателей', 'веса' и получения count

library(tidyverse)
out <- map(1:5, ~ 
       data %>%
         select(group, type, matches(as.character(.x))) %>% 
         group_by(group, type) %>%
         count(!! rlang::sym(str_c("score", .x)), 
         wt = !! rlang::sym(str_c("weight", .x))))

Выход будет list частоты count tibble.Если мы хотим создать отдельные данные, используйте map_df с .id

0 голосов
/ 31 мая 2019

Я не уверен, что точно понимаю, что вы ожидаете, но вы можете попробовать что-то вроде этого:

for (i in 1:max(data[["group"]])) { #looping through groups
  weighted_score <- ... ## create your wheighted score for group i here

  name <- paste("vec",i,sep="")
  assign(name,weighted_score)

}
...