Я знаю, что вокруг есть много подобных вопросов, но я боюсь, что я не мог окунуться в эту конкретную сторону, хотя, очевидно, это очень просто!Как применить функцию 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',' inside', 'subset' и т. Д. ** являются ** не ** вашим другом. используйте '' 'исключительно и все работает лучше. – Gregor
@Gregor Спасибо! Но могу ли я спросить, почему? И вы хотите сказать, например, что я должен избегать использования ярлыка '' '' '(как в' dat $ u1') и вместо этого использовать 'dat [, 2]'? – Eva
'dat $ u2' отлично, если' 'u2" '- это имя столбца. Но если 'u2 <-" mpg ",' mtcars $ u2' не будет работать, потому что '$' не оценивает 'u2', он ищет столбец с именем' 'u2" '. Но если 'u2 <-" mpg ",' mtcars [, u2] '** будет работать **, как и' mtcars [, "mpg"] '. См., Например, 'fortunes :: fortune (343)', 'fortunes :: fortune (312)' и предупреждение в '? Subset' ..., которое, вероятно, должно быть включено в'? With'. – Gregor