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