将计算应用于指定数量的列并将结果存储在单独的对象中,最后合并

Apply calculation to specified number of columns and store the result in separate objects, to be combined at the end

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

一个最小的例子如下:

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"))

应该return:

> 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 

我所做的修改:

  1. 从硬编码 $C1(等)更改为更动态的 data[[nm]] 心态;
  2. 根据参数将硬编码 $Base 更改为一个,并使用默认值,这样虽然您不需要更改它,但如果您想将它应用于不同的数据(使用一个不同的“基本”列),你仍然可以;
  3. 是否使用 sapply 进行了动态调整,这将 return(此处)是一个与 col.names 长度相同的向量 ... 假设提供的所有列都存在于数据中并且 numeric-like;
  4. 使用 subset(., select=) 而不是 [,因为后者在某些情况下可以下降到向量而不是单列框架(即 base::[.data.frame 和简单的 data.frame,不是 tbl_df).
  5. 删除了两个无关的 pmin。它与单个参数一起使用是空操作:它的功能是在两个或多个向量之间提供最小 element-wise;将它应用于单个向量什么都不做。