2015-05-26 3 views
2

У меня есть следующие dataframe: «C2»R: Multiple если заявление функция применяется

ID  C1  C2 
    1  0  100 
    2  29  0 
    3  0  0 
    4  789  400 

Я хочу, чтобы указать «тип», основанный на столбцах «C1» и Например, если C1 и C2 равны 0 (или NA), это «Тип 1.», Если C1! = 0 и C2 = 0 (или NA), то это «Тип 2.» ! Типа 3 -> C1 = 0 (& NA), C2 = 0 Тип 4 -> C1 = 0 и С2 = 0

Вывод должен выглядеть примерно так:

!
Type 
Type 4 
Type 2 
Type 1 
Type 3 

Я попробовал несколько различных способов:

for (i in 1:nrow(df)) 
{ 
if 
((is.na(df[i,12]) == TRUE) | (df[i,12] == 0.00) & 
(is.na(df[i,13]) == TRUE) | (df[i,13] == 0.00)) 
{ 
df2[i,1] = "Type 1" 
} 
else 
    { 
    df2[i,1] = "Other Type" 
} 
} 

я не включают в себя все условия выше для цикла, но это очень медленно.

Вот еще один метод, который я попробовал (не полный код, а просто пытается):

ifelse((is.na(Test_Customer[,2]) | Test_Customer[,2]==0), "Type 1", "Type 2") 

Для IfElse заявления, я предполагаю, что я обернуть его в функцию, а затем использовать применить функцию, чтобы применить это для всех строк данных. Однако, R принимает вложенные операторы ifelse, такие как «if» в excel?

Если кто знает альтернативный способ сделать это, это было бы здорово! Большое спасибо заранее!!

+0

Вы упомянули логику для типов 1 и 2, но ваш желаемый результат показывает с 1 по 4. Пожалуйста, предоставьте более подробные сведения. – r2evans

ответ

1

Вы можете использовать interaction, чтобы попасть туда, как только вы преобразовать данные в 1/0sign с помощью:

factor(do.call(interaction,sign(dat[-1])),labels=paste("Type",c(1,2,4,3))) 
#[1] Type 4 Type 2 Type 1 Type 3 
#Levels: Type 1 Type 2 Type 4 Type 3 

Это покажет вам, что кодирование относится к: (значений C1.C2):

do.call(interaction,sign(dat[-1])) 
#[1] 0.1 1.0 0.0 1.1 
#Levels: 0.0 1.0 0.1 1.1 

Я бы лично переключил категории Type 4 и Type 3, но это зависит от вас, я полагаю.

0

Я могу обеспечить только начало, так как вы не включили в себя логику для классификации типов 3 и 4, но это не должно быть трудно распространить на дополнительные ограничения.

Вы очень близки с ifelse, и нет необходимости использовать apply:

## dat is data.frame from the OP 
with(dat, ifelse((is.na(C1) | C1 == 0) & (is.na(C2) | C2 == 0), 1, 2)) 
## [1] 2 2 1 2 

Вместо этого вы можете вернуть буквенные строки символов, заменив 1 и 2 выше, и это может быть использован сам по себе или добавлен как новый столбец к исходному кадру данных.