我知道周圍有很多類似的問題,但恐怕無法繞開這個特定的問題,但顯然它非常簡單!如何按列名應用ifelse函數?
我想寫一個簡單的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
功能上的每一列分別。
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
當試圖使用存儲在變量中的列名時,諸如'$','with','within','subset'等的快捷鍵不是**你的朋友。只使用'[''而且事情效果更好。 – Gregor
@格雷戈謝謝!但我可以問爲什麼?你的意思是,例如,我應該避免使用快捷方式'$'(如'dat $ u1')並使用'dat [,2]'來代替? – Eva
如果'「u2」'是一個列的名字,'dat $ u2'就可以了。但是如果'u2 < - 「mpg」','mtcars $ u2'將不起作用,因爲'$'不會評估'u2',它會查找一個名爲'「u2」'的列。但是如果'u2 < - 「mpg」','mtcars [,u2]'**將會工作,就像'mtcars [,'mpg「]'一樣。例如,參見'fortunes :: fortune(343)','fortunes :: fortune(312)'和'subset'中的警告......應該也可以包含在'with with'中。 – Gregor