我有一個包含幾列的資料框。我想在名稱存盤在向量中的所有列上運行一個函式 [pmax() 在這種情況下],并將結果存盤在新的單獨列中。最后,我還想將所有新列的名稱存盤在一個單獨的向量中。一個最小的例子是:
Name <- c("Case 1", "Case 2", "Case 3", "Case 4", "Case 5")
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, C1, C2, C3, C4)
var.min <- function(data, col.names){
new.df <- data
# This is how I would do it outside a function and without loop:
new.df$max.def.col.exc.1 <- pmax(new.df$C2, new.df$C3)
new.df$max.def.col.exc.2 <- pmax(new.df$C1, new.df$C3)
new.df$max.def.col.exc.3 <- pmax(new.df$C1, new.df$C2)
new.columns <- c("max.def.col.exc.1", "max.def.col.exc.2", "max.def.col.exc.3")
return(new.df)
}
new.df <- var.min(Data,
col.names= c("C1", "C2", "C3"))
結果應如下所示:
Name C1 C2 C3 C4 max.def.col.exc.1 max.def.col.exc.2 max.def.col.exc.3
1 Case 1 1 0 0 1 0 1 1
2 Case 2 0 1 1 1 1 1 1
3 Case 3 1 1 0 0 1 1 1
4 Case 4 1 1 0 1 1 1 1
5 Case 5 0 0 0 0 0 0 0
有人有想法嗎?提前謝謝了!
uj5u.com熱心網友回復:
這是一個基本的 R 解決方案combn。它獲取列名的所有成對組合并呼叫函式計算pmax。
請注意,預期輸出列的順序與下面代碼的輸出順序相同。如果列向量為c("C1", "C2", "C3"),則順序會有所不同。
另請注意,該函式現在是一個單行并接受任意數量的列(2、3 或更多)的組合。
var.min <- function(cols, data) Reduce(pmax, data[cols])
cols <- c("C3", "C2", "C1")
combn(cols, 2, var.min, data = Data)
# [,1] [,2] [,3]
#[1,] 0 1 1
#[2,] 1 1 1
#[3,] 1 1 1
#[4,] 1 1 1
#[5,] 0 0 0
現在只需分配列名和cbind輸入資料。
tmp <- combn(cols, 2, var.min, data = Data)
colnames(tmp) <- paste0("max.def.col.exc.", seq_along(cols))
Data <- cbind(Data, tmp)
rm(tmp) # final clean-up
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/333848.html
上一篇:如何自動獲取要在引數中設定的值
