2015-02-03 6 views
0

У меня есть ниже ДФMultiple IfElse заявление

 var1 var2 a1 a2 
1 a b  y  z 
2 b a  z  y 
3 b b  z  z 

создан из следующего кода

help <- data.frame(var1 = c("a", "b", "b"), var2 = c("b", "a", "b"), a1 = c(y, z, z), a2 = c(z, y, z)) 

мое намерение состоит в том, чтобы создать IfElse заявление, в котором я нахожусь в состоянии (1) заменить все a1 значения to 'bp', когда var1 равно 'a', и (2) заменяют все значения a2 на 'bp', когда var2 равно 'a'. Я не хочу изменять значение, если var1 или var2 не является «a».

Является ли команда ifelse не лучшим способом решить эту проблему? Я начал делать каждый вручную, используя help$a1[help$a1 == "a"] <- "bp", однако это займет немного времени, поскольку у меня есть несколько переменных и большой набор данных. Любая помощь будет отличной.

Большое спасибо.

+0

Сколько у вас правил замены? Моя дикая догадка заключается в том, что в вашем случае могут быть полезны дополнительные наборы данных с правилами. 'var1.rules <- c (a = 0, b = 1, c = 2)' и 'var2.rules <- c (a = 0, b = 1, c = 2)' –

+0

Мне пришлось отредактировать сообщение немного из-за необходимости всех векторов символов. У меня есть 60 различных уникальных переменных, которые нужно изменить в var1 и var2 ... но не уверены, отвечает ли это на ваш вопрос ... – bpace

+0

Вы имеете в виду, что имена ваших столбцов выглядят как 'c ('var1', 'var2', ' var3, ..., varN, a1, a2, строка в столбце «aX» равна «a» для любого X от 1 до N? –

ответ

1

Вы можете использовать стандартное подмножество. Предполагая, что на вопрос редактирования, что a1 и a2 имеет класса «характер», то

df 
# var1 var2 a1 a2 
#1 a b y z 
#2 b a z y 
#3 b d z z 

df[,3:4][df[,1:2]=="a"]<-"bp" 

df 
# var1 var2 a1 b2 
#1 a b bp z 
#2 b a z bp 
#3 b d z z 

Вы также можете воспользоваться вашим именованием для того же

sel<-paste0("var",1:2) 
mut<-paste0("a",1:2) 
df[,mut][df[,sel]=="a"]<-"bp" 

В любом случае внутренней частью, например, df[,sel]=="a" возвращает логическую матрицу той же формы, что и df[,sel] (и, следовательно, такая же форма, как df[,mut]), которая равна TRUE, где и только там, где был «a». Внешняя часть, например, df[,mut][...], использует эту логическую матрицу для указания подмножества, подлежащего присвоению.

+0

В Webb вы можете объяснить, что это значит ... Я переводил это, чтобы «изменить столбцы 3 или 4 в df на« bp », если столбцы 1 или 2 содержат«. Это звучит правильно? – bpace

+0

@bpace Внутренний бит, 'df [, 1: 2] ==" a "' возвращает логическую матрицу той же формы, что и 'df [, 1: 2]' (и, следовательно, 'df [, 3: 4] '), которая истинна там и только там, где была« а ». Внешний бит 'df [, 3: 4] [...]' является подмножеством с логической матрицей, подчиняются только те записи, которые соответствуют значению 'TRUE' в матрице. –

Смежные вопросы