【问题标题】:Vectorization in RR中的矢量化
【发布时间】:2016-05-30 21:59:08
【问题描述】:

我是 R 新手,我研究过矢量化。但我仍在努力训练我的思维以矢量化的方式思考。很多时候,向量化而不是循环的例子要么太简单,所以我很难概括它们,要么根本不存在。

谁能建议我如何矢量化以下内容?

Model2 <- subset(Cor.RMA, MODEL == Models.Sort[2,1])
RCM2 <- count(Model2$REPAIR_CODE)
colnames(RCM2) <- c("REPAIR_CODE", "FREQ")
M2M <- merge(RCM.Sort, RCM2, by = "REPAIR_CODE", all.x = TRUE)
M2M.Sort <- M2M[order(M2M$FREQ.x, decreasing = TRUE), ]
M2M.Sort[is.na(M2M.Sort)] <- 0

以上代码中,每个“2”需要从2到85运行

writeWorksheetToFile(file="CL2 - TC - RC.xlsx", 
                     data = M2M.Sort[ ,c("FREQ.y")], 
                     sheet = "RC by Model", 
                     clearSheets = FALSE,
                     startRow = 6,
                     startCol = 6)

在上面的代码中,“data”应该从“M2M...”到“M85M...”,“startCol”应该从 6 到 89 运行以进行 Excel 打印输出。

来自 (Cor.RMA) 的数据框包含“MODEL”、“REPAIR_CODE”列和其他未使用的列。 RCM.Sort 是所有模型中每个“REPAIR_CODE”的频率表,我用作主列表以连接特定于设备的修复代码计数。 (左连接:all.x = TRUE) Models.Sort 是我使用 plyr 包中的“count”函数生成的频率表,因此我可以为每个模型创建子集。 然后我合并使用“唯一”函数生成的每个“修复代码”的列表。

样本数据:

CASE_NO   DEVICE_TYPE   MODEL   TRIAGE_CODE   REPAIR_CODE
12341     Smartphone    X       TC01          RC01
12342     Smartphone    Y       TC02          RC02
12343     Smartphone    Z       TC01, TC05    RC05
12344     Tablet        AA      TC02          RC37
12345     Wearable      BB      TC05          RC37
12346     Smartphone    X       TC07          RC01
12347     Smartphone    Y       TC04          RC02

如果您愿意提供帮助,我非常感谢您的时间和精力。

【问题讨论】:

  • 您能提供一个样本数据集吗?这将使您更容易理解您要做什么。另外,您忘记定义RCM.Sort。据我所知,您只是想将count 应用于$REPAIR_CODE 以获取Models.Sort[2:85,1],对吗?
  • 我已按照您的建议对查询进行了 2 处更改。是的,我需要按照您的建议申请 count,然后将其输入到合并过程中。
  • aggregate(Cor.RMA$REPAIR_CODE,list(Cor.RMA$MODEL),table) 怎么样?这不是您想要的,但我认为无论如何这将是一种更连贯的格式。
  • 唯一的问题是控制台中显示的结果与保存为对象时的结果不同,因此无法正常打印到 Excel。
  • 解决了,看答案。

标签: r vectorization


【解决方案1】:

好吧,这不是你的原始脚本所做的,但这里是:

models <- c("X","Y","Z","AA","BB") # in your case it would be Models.Sort[2:85,1]
new <- Cor.RMA[Cor.RMA$MODEL %in% models,]
new2 <- aggregate(new$REPAIR_CODE, list(new$MODEL), table)

temp <- unlist(new2[[2]])
temp <- temp[, order(colSums(temp), decreasing = T)]
out <- data.frame(group=new2[,1], temp)
out <- out[order(rowSums(out[,-1]), decreasing = T),]

out
#   group RC01 RC02 RC37 RC05
# 3     X    2    0    0    0
# 4     Y    0    2    0    0
# 1    AA    0    0    1    0
# 2    BB    0    0    1    0
# 5     Z    0    0    0    1

然后,您可以轻松地将其写入xlsx文件,例如,带:

require(xlsx)
xlsx:::xlsx.write(out,"test.xlsx",row.names=F) 

编辑:添加排序。 编辑2:固定排序。

【讨论】:

  • 这太棒了!!非常感谢。它真的有助于我看到矢量化的真正工作。现在我必须在脚本中应用一些排序逻辑。我想通过最高整体设备频率对行进行排序,然后是列的最高整体修复_code。 span>
  • 我认为这是您正在寻找的。如果是,请不要忘记通过按左侧的复选标记接受答案。 span>
  • 排序完全完成,但它没有带有正确的行。相反,模型是按字母顺序排列的。 span>
  • ha,这是愚蠢的。好的,修好了。我想:)编辑:注意我也更改了一些以前的变量名称,因此不要运行任何旧代码。 span>
  • 你是最好的!我非常感谢你的帮助。这为我的一些代码提供了学习。 span>
猜你喜欢
  • 2016-02-11
  • 1970-01-01
  • 1970-01-01
  • 2011-11-28
  • 2012-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-01
相关资源
最近更新 更多