簡體   English   中英

如何通過列名應用ifelse函數?

[英]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許多變體,但顯然我ifelseifelse因為這些分組函數分別在每個列上復制了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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM