r - 将计算应用于指定数量的列并将结果存储在单独的对象中,最后合并
问题描述
我有一个数据框,我想在其中将计算应用于指定的不同数量的列,并将结果存储在单独的对象中,最后合并。
一个最小的示例如下所示:
Name <- c("Case 1", "Case 2", "Case 3", "Case 4", "Case 5")
Base <- c(0, 0, 0, 1, 1)
C1 <- c(1, 0, 1, 1, 0)
C2 <- c(0, 1, 1, 1, 0)
C3 <- c(0, 1, 0, 0, 0)
C4 <- c(1, 1, 0, 1, 0)
Data <- data.frame(Name, Base, C1, C2, C3, C4)
score.calc <- function(data, col.names){
# This is how I would to it outside a function and without loop:
Score1 <- sum(pmin(Data$C1, pmin(Data$Base)))/sum(pmin(Data$Base))
Score2 <- sum(pmin(Data$C2, pmin(Data$Base)))/sum(pmin(Data$Base))
Score3 <- sum(pmin(Data$C3, pmin(Data$Base)))/sum(pmin(Data$Base))
Scores <- c(Score1, Score2, Score3)
}
new.score <- score.calc(Data,
col.names= c("C1", "C2", "C3"))
并且应该返回:
> new.score
[1] 0.5 0.5 0.0
有人有想法吗?非常感谢!
解决方案
尝试这个:
score.calc <- function(data, col.names, base = "Base") {
sapply(subset(data, select = col.names),
function(z) sum(pmin(z, Data[[base]]))/sum(Data[[base]]))
}
score.calc(Data, c("C1", "C2", "C3"))
# C1 C2 C3
# 0.5 0.5 0.0
我所做的更改:
- 从硬编码
$C1
(等)转变为更具活力的data[[nm]]
心态; - 根据参数将硬编码更改
$Base
为一个,并使用默认值,这样虽然您不需要更改它,但如果您想将其应用于不同的数据(使用不同的“基础”列),您仍然能够; - 使用 动态进行吗,这将返回(此处)一个与...
sapply
长度相同的向量,假设提供的所有列都存在于数据中,并且- 类似;col.names
numeric
- 使用
subset(., select=)
代替[
,因为后者在某些情况下可以下降到向量而不是单列框架(即,base::[.data.frame
简单的data.frame
,而不是tbl_df
)。 - 去掉了两个无关
pmin
的。它与单个参数一起使用是无操作的:它的功能是在两个或多个向量之间提供最小元素;将其应用于单个向量什么也不做。
推荐阅读
- git - 应用 git patch 会自动添加补丁文件进行暂存?
- odata - 如何覆盖 OData 过滤器查询验证器以允许未定义模型的属性
- microsoft-cognitive - 使用 Face API 来增强身份服务
- symfony - 找不到类“Symfony\Component\HttpFoundation\RedirectResponse”
- apache-spark - 如何在 oozie 工作流程中运行 spark 程序?
- angular - PrimeNG Treetable 子节点发布扩展事件
- apache-spark-sql - SPARK SQL 中的 DATEDIFF
- reactjs - Material UI - 如何在 TableFooter 中将 IconButton 居中?
- java - 同一服务器上的两个项目具有不同的端口但客户端(Angular 6)无法调用服务器(Spring Boot)
- java - Surefire 插件 > 2.19 版和 junit 套件