【问题标题】:R Loop To Make New VectorsR 循环制作新向量
【发布时间】:2019-05-31 13:55:56
【问题描述】:
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)

但是我的目标是创建一个类型的循环,这样我就可以为 score1-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

等等等等。

【问题讨论】:

  • 您的预期输出是什么样的?
  • 6 个向量(对于组和类型的每个组合),每个向量包含 5 个使用 count() 估计的数字,如示例所示
  • 最好有一个 set.seed 并且至少对于一个组合来说也期望 oiutput。你展示了count(data, score1, wt = weight1),这就是我使用的类似逻辑
  • 谢谢你,但我为什么要设置一个没有随机的种子?
  • @bvowe 我想你有sample

标签: r loops sapply


【解决方案1】:

我们可以使用map循环遍历每一个对应的'score'、'weight',得到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))))

输出将是频率为counttibblelist。如果我们要创建单个数据,请使用 map_df.id

【讨论】:

  • 您好,实际上应该有 6 个向量(每个组 * 类型一个),每个向量的长度应该是 5(每个分数)这样有意义吗??
  • @bvowe 我的代码基于您在帖子中提供的代码 sn-p。不清楚
  • 我很抱歉。我有六个组(2 组 * 3 种类型)。对于每个 GROUP,我的目标是估计分数 1 到分数 5 的样本加权计数。这应该会产生总共 6 个向量(每个 GROUP 一个),每个向量应该包含 5 个值(每个分数一个)
  • @bvowe 在这种情况下,只需在“计数”中添加grouptype。更新
  • 我相信你的代码可以工作,但是现在如果数据是长而不是宽怎么办?
【解决方案2】:

我不确定你的预期输出到底是什么,但你可能想尝试这样的事情:

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)

}

【讨论】:

  • 我需要遍历 group * 类型。同样对于 weighted_score
猜你喜欢
  • 2016-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-09
  • 2018-11-25
  • 1970-01-01
  • 2021-12-01
  • 2017-07-08
相关资源
最近更新 更多