[英]How to apply ifelse function by column names?
我知道周圍也有很多類似的問題,但是恐怕無法解決這個特定的問題,盡管顯然這很簡單!
我正在嘗試編寫一個簡單的ifelse函數,以使用列名 (而不是數字)應用於數據框中的一系列列。 我試圖做的是創建一個u_all
變量,如下所示,而無需重復鍵入列名。
dat <- data.frame(id=c(1:20),u1 = sample(c(0:1),20,replace=T) , u2 = sample(c(0:1),20,replace=T) , u3 = sample(c(0:1),20,replace=T))
dat<-within(dat,u_all<-ifelse (u1==1 | u2==1 |u3==1,1,0))
dat
我嘗試了apply
許多變體,但顯然我ifelse
了ifelse
因為這些分組函數分別在每個列上復制了ifelse
函數。
dat2 <- data.frame(id=c(1:20),u1 = sample(c(0:1),20,replace=T) , u2 = sample(c(0:1),20,replace=T) , u3 = sample(c(0:1),20,replace=T))
dat2<-cbind(dat2,sapply(dat2[,grepl("^u\\d{1,}",colnames(dat2))],
function(x){ u_all<-ifelse(x==1 & !is.na(x),1,0)}))
dat2
這條線來自OP
dat<-within(dat,u_all<-ifelse (u1==1 | u2==1 |u3==1,1,0))
可以改為
dat$u_all <- +Reduce("|", dat[, c("u1", "u2", "u3")])
就中間對象而言,它是如何工作的:
D = dat[, c("u1", "u2", "u3")]
使用列的名稱對數據幀進行子集化。 r = Reduce("|", D)
通過放置|
折疊數據 在每對列之間。 結果是邏輯(TRUE / FALSE)向量。 r
轉換為0/1整數向量,可以使用ifelse(r,1L,0L)
或as.integer(r)
(因為TRUE / FALSE默認情況下轉換為1/0)或僅一元+
,例如+r
如果您想避免使用列名(從帖子中我真的不清楚),則可以構造D = dat[-1]
來排除第一列。
您快要准備好了,這是一個解決方案,該方法適用於行並使用all將測試向量轉換為一個數字。
dat2$u_all <- apply(dat2[,-1], MARGIN=1, FUN=function(x){
any(x==1)&all(!is.na(x))*1
}
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.