我有一個資料框,我想在其中對指定的不同數量的列應用計算,并將結果存盤在單獨的物件中,最后進行組合。
一個最小的例子看起來像:
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
有人有想法嗎?非常感謝!
uj5u.com熱心網友回復:
嘗試這個:
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,而不是 atbl_df)。 - 去掉了兩個無關的
pmin。它與單個引數一起使用是無操作的:它的功能是提供兩個或多個向量之間的最小元素;將它應用于單個向量什么都不做。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/333112.html
上一篇:根據來自3列的資訊進行過濾
