2016-09-08 4 views
1

Ich habe ein Problem beim Versuch, neue Spalte mit ifelse zu erstellen. Ganz ähnlich Frage ist dplyr error: strange issue when combining group_by, mutate and ifelse. Is it a bug?Mutate und Ifelse() fehlschlagen becase von NA-Existenz in Spalte

set.seed(101) 
time =sort(runif(10,0,10)) 
group=rep(c(1,2),each=5) 
az=c(sort(runif(5,-1,1),decreasing = T),sort(runif(5,-1,0.2),decreasing = T)) 

df <- data.frame(time,az,group) 

#  time   az group 
#1 0.4382482 0.86326886  1 
#2 2.4985572 0.75959146  1 
#3 3.0005483 0.46394519  1 
#4 3.3346714 0.41374948  1 
#5 3.7219838 -0.08975881  1 
#6 5.4582855 -0.01547669  2 
#7 5.8486663 -0.29161632  2 
#8 6.2201196 -0.50599980  2 
#9 6.5769040 -0.73105782  2 
#10 7.0968402 -0.95366733  2 

im df ich versuche zu bedingten mutieren clas Spalte. Da es jedoch NA innerhalb von sw_time gibt, wird die gesamte clas Spalte auch NA, in der group 1 in üblicher Weise nrm sein sollte.

df1 <- df%>% 
    group_by(group)%>% 
    mutate(sw_time=abs(time[which(az<=0.8)[1]]-time[which(az>0)[1]]))%>% 
    mutate(clas=as.numeric(ifelse(sw_time<3,"nrm","abn"))) 

Source: local data frame [10 x 5] 
Groups: group [2] 

     time   az group sw_time clas 
     (dbl)  (dbl) (dbl) (dbl) (dbl) 
1 0.4382482 0.86326886  1 2.060309 NA 
2 2.4985572 0.75959146  1 2.060309 NA 
3 3.0005483 0.46394519  1 2.060309 NA 
4 3.3346714 0.41374948  1 2.060309 NA 
5 3.7219838 -0.08975881  1 2.060309 NA 
6 5.4582855 -0.01547669  2  NA NA 
7 5.8486663 -0.29161632  2  NA NA 
8 6.2201196 -0.50599980  2  NA NA 
9 6.5769040 -0.73105782  2  NA NA 
10 7.0968402 -0.95366733  2  NA NA 

danke im voraus für ihre aktionen!

+2

verwenden Sie zwingen ein Zeichen zu numerisch. Es wird definitiv zu NA führen. Vielleicht brauchst du 'clas = as.numeric (Faktor (ifelse (...' – akrun

+0

@akrun yeap Ich habe es gerade ausprobiert, aber jetzt wird 'Gruppe 1'' clas' zu 1 nicht 'nrm') – Alexander

+0

In diesem Fall entfernst du einfach die 'as.numeric'. – akrun

Antwort

2

Durch Umwandlung von character in numeric wird NA angezeigt. Stattdessen müssen wir eine factor Klasse haben, die

df %>% 
    group_by(group)%>% 
    mutate(sw_time=abs(time[which(az<=0.8)[1]]-time[which(az>0)[1]]), 
      clas=as.integer(factor(ifelse(sw_time<3,"nrm","abn")))) 

zu numeric coerces Wenn wir nur daran interessiert, 'NRM', 'abn' sind, entfernen Sie einfach die as.integer(factor Einwickeln

df%>% 
    group_by(group)%>% 
    mutate(sw_time=abs(time[which(az<=0.8)[1]]-time[which(az>0)[1]]), 
      clas=ifelse(sw_time<3,"nrm","abn")) 
#  time   az group sw_time clas 
#  <dbl>  <dbl> <dbl> <dbl> <chr> 
#1 0.4382482 0.86326886  1 2.060309 nrm 
#2 2.4985572 0.75959146  1 2.060309 nrm 
#3 3.0005483 0.46394519  1 2.060309 nrm 
#4 3.3346714 0.41374948  1 2.060309 nrm 
#5 3.7219838 -0.08975881  1 2.060309 nrm 
#6 5.4582855 -0.01547669  2  NA <NA> 
#7 5.8486663 -0.29161632  2  NA <NA> 
#8 6.2201196 -0.50599980  2  NA <NA> 
#9 6.5769040 -0.73105782  2  NA <NA> 
#10 7.0968402 -0.95366733  2  NA <NA> 

Wir können auch verwenden data.table

library(data.table) 
setDT(df)[, c("sw_time", "clas") := { 
      v1 <- abs(time[which(az <= 0.8)[1]] - time[which(az > 0)[1]]) 
      .(v1 , c("abn", "nrm")[(v1 < 3) + 1]) }, 
         by = group] 

Wenn die endgültige Ausgabe nicht 'nrm', 'abn' beinhaltet, brauchen wir den ifelse Teil nicht. Wir können direkt as.integer(sw_time <3)

+0

Ich konnte nicht direkt' as.integer (sw_time <3) 'fangen. wo ist' nrm' und 'abn' sollte definiert werden, wenn es keine' ifelse' gibt? – Alexander

+0

@Alexander Bitte überprüfen der zweite Codeblock, der letzte war, als ich mir über die erwartete Ausgabe nicht sicher war. Ich dachte, du wolltest einen numerischen Index anstelle von 'nrm', 'abn' – akrun

+0

haben, das erwartete Zeichen ist wie 'nrm' Ich führe 'df%>% group_by (group)%>% mutiere (sw_time = abs (Zeit [welche (az <= 0.8) [1]] - Zeit [welche (az> 0) [1]]), clas = ifelse (sw_time <3, "nrm", "abn")) 'Ich erhalte Fehler' Fehler: inkompatible Typen, erwarte einen Charaktervektor ly das mein Originalcode richtig? – Alexander

Verwandte Themen