首页 > 解决方案 > 将计算应用于指定数量的列并将结果存储在单独的对象中,最后合并

问题描述

我有一个数据框,我想在其中将计算应用于指定的不同数量的列,并将结果存储在单独的对象中,最后合并。

一个最小的示例如下所示:

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

有人有想法吗?非常感谢!

标签: rfunctionloopsmultiple-columns

解决方案


尝试这个:

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 

我所做的更改:

  1. 从硬编码$C1(等)转变为更具活力的data[[nm]]心态;
  2. 根据参数将硬编码更改$Base为一个,并使用默认值,这样虽然您不需要更改它,但如果您想将其应用于不同的数据(使用不同的“基础”列),您仍然能够;
  3. 使用 动态进行吗,这将返回(此处)一个与...sapply长度相同的向量,假设提供的所有列都存在于数据中,并且- 类似;col.namesnumeric
  4. 使用subset(., select=)代替[,因为后者在某些情况下可以下降到向量而不是单列框架(即,base::[.data.frame简单的data.frame,而不是tbl_df)。
  5. 去掉了两个无关pmin的。它与单个参数一起使用是无操作的:它的功能是在两个或多个向量之间提供最小元素;将其应用于单个向量什么也不做。

推荐阅读