[R] mapple

Rui Barradas ru|pb@rr@d@@ @end|ng |rom @@po@pt
Wed Oct 2 16:15:52 CEST 2019


Hello,

A logical index seems right. (And even intuitive?)

Create an index based on the conditions, multiplying 0/1 (FALSE/TRUE) by 
the condition number. If all conditions are false, the index will be 0.

Then use ifelse() to update 'code'.

new_values <- c(1, 5, 10)
i <- apply(phdf[-6], 1, function(x){
     1*all(x == 0) +                       # rule 1
     2*(x[1] == 1 & x[2] == 1) +           # rule 2
     3*(x[1] == 0 & x[2] == 1 & x[3] == 2) # rule 3
})
phdf$code <- ifelse(i == 0, phdf$code, new_values[i])


Hope this helps,

Rui Barradas

Às 04:24 de 02/10/19, Jim Lemon escreveu:
> Hi Phillip,
> The following seems to do what you want:
> 
> phdf<-read.table(text="v1 v2 v3 v4 v5 code
>   0  0  0  0  0    1
>   1  4  0  0  0    1
>   1  1  0  0  0    1
>   1  0  1  0  0    1
>   2  0  1  0  0    1
>   0  1  0  0  0    1
>   0  1  2  0  0    1
>   0  1  2  3  0    1
>   0  2  3  4  4    1
>   0  0  0  2  3    1",
>   header=TRUE,
>   stringsAsFactors=FALSE)
> rules<-list("x[1]==0&&x[2]==0&&x[3]==0&&x[4]==0&&x[5]==0",
>   "x[1]==1&&x[2]==1","x[1]==0&&x[2]==1&&x[3]==2")
> outcomes<-c(1,5,10)
> apply_rule<-function(x,rule) return(eval(parse(text=rule)))
> for(ri in 1:length(rules))
>   phdf[apply(phdf,1,apply_rule,rules[[ri]]),"code"] <- outcomes[ri]
> 
> and can be expanded to the number of rules that you want. BUT, you
> have not specified a non-match value, so your initial values for
> "code" will persist.
> 
> Jim
> 
> On Wed, Oct 2, 2019 at 12:32 PM Phillip Heinrich <herd_dog using cox.net> wrote:
>>
>> With the snippet of data below I’m trying to do an if/then type of thing:
>>      row 1 – if all five variables equal 0 then code equals 1;
>>      row 3 – if v1 = 1 and v2 = 1 then code = 5;
>>      row 7 – if v1 = 0 and v2 = 1 and v3 = 2 then code = 10
>>
>> There are 24 codes in the complete database.
>>
>>
>>     v1 v2 v3 v4 v5 code
>> 1   0  0  0  0  0    1
>> 2   1  4  0  0  0    1
>> 3   1  1  0  0  0    1
>> 4   1  0  1  0  0    1
>> 5   2  0  1  0  0    1
>> 6   0  1  0  0  0    1
>> 7   0  1  2  0  0    1
>> 8   0  1  2  3  0    1
>> 9   0  2  3  4  4    1
>> 10  0  0  0  2  3    1  I understand that the mapply function can do things like this but I have been reading documentation and poking around with Google but am getting nowhere.  Any advise whould be greatly appreciated.
>>          [[alternative HTML version deleted]]
>>
>> ______________________________________________
>> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
> 
> ______________________________________________
> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>



More information about the R-help mailing list