10
votes

Na en données.Table

J'ai un data.table code> qui contient des groupes. J'utilise sur chaque groupe et certains groupes renvoient des chiffres, d'autres renvoient na code>. Pour une raison quelconque, data.Table code> a du mal à remettre tout le tout. Est-ce un bug ou suis-je mal compris? Voici un exemple:

dtb <- data.table(a=1:10)
f <- function(x) {if (x==9) {return(NA)} else { return(x)}}
dtb[,f(a),by=a]

Error in `[.data.table`(dtb, , f(a), by = a) : 
  columns of j don't evaluate to consistent types for each group: result for group 9 has     column 1 type 'logical' but expecting type 'integer'


4 commentaires

Dupliqué possible de Pourquoi la médiane est-elle en train de traduire les données.Table ( entier contre double)?


J'ai déjà eu un problème connexe: Séfonciez une donnée avec le sous-opérateur: fonctions qui renvoient des valeurs numériques et / ou des NAS échouent


@Alex Lorsque la question concerne un message d'erreur, essayez de vous chercher à la recherche de S. pour le message d'erreur. Par exemple Cette recherche renvoie les 2 liens ci-dessus et un 3ème.


Merci pour les références! J'ai essayé de chercher NA dans Data.table sur Google mais n'a pas beaucoup frappé. Je vais essayer à la recherche du message d'erreur la prochaine fois. Appréciez l'aide.


3 Réponses :


14
votes

de ? na code>

NA est une constante logique de longueur 1 qui contient un indicateur de valeur manquante. NA peut être contraint à tout autre type de vecteur sauf brut. Il existe également des constantes Na_integer_, na_real_, na_complex_ et na_character_ des autres types de vecteur atomiques qui prennent en charge les valeurs manquantes: tous sont des mots réservés dans la langue r. P> blockQquote>

Vous devrez spécifier le type correct pour votre fonction pour fonctionner - p>

Vous pouvez contraindre dans la fonction pour correspondre au type de x code> (Notez que nous Besoin de n'importe quel code> pour que cela fonctionne pour fonctionner pour des situations avec plus de 1 rangée dans un sous-ensemble! p> xxx pré>

plus data.table * approche * ish * approche h1 >

Cela pourrait faire plus de données.Table sens d'utiliser définir code> (ou : = code>) pour définir / remplacer par référence. P>

library(data.table)

set.seed(1)
n <- 1e+07
DT <- data.table(a = sample(15, n, T))
setkeyv(DT, "a")
DTa <- copy(DT)
DTb <- copy(DT)
DTc <- copy(DT)
DTd <- copy(DT)
DTe <- copy(DT)

f <- function(x) {
    if (any(x == 9)) {
        return(as(NA, class(x)))
    } else {
        return(x)
    }
}

system.time({DT[a == 9, `:=`(a, NA_integer_)]})
##    user  system elapsed 
##    0.95    0.24    1.20 
system.time({DTa[a == 9, `:=`(a, NA)]})
##    user  system elapsed 
##    0.74    0.17    1.00 
system.time({DTb[J(9), `:=`(a, NA_integer_)]})
##    user  system elapsed 
##    0.02    0.00    0.02 
system.time({set(DTc, which(DTc[, a] == 9), j = "a", value = NA)})
##    user  system elapsed 
##    0.49    0.22    0.67 
system.time({set(DTc, which(DTd[, a] == 9), j = "a", value = NA_integer_)})
##    user  system elapsed 
##    0.54    0.06    0.58 
system.time({DTe[, `:=`(a, f(a)), by = a]})
##    user  system elapsed 
##    0.53    0.12    0.66 
# The are all the same!
all(identical(DT, DTa), identical(DT, DTb), identical(DT, DTc), identical(DT, 
    DTd), identical(DT, DTe))
## [1] TRUE


9 commentaires

intéressant! Pourriez-vous s'il vous plaît élaborer un peu? Je n'ai pas réalisé qu'il y avait différents types de valeurs na ..


Regardez ? Na (citant) * Il existe également des constantes NA_INTEGER_, NA_REAL_, NA_COMPLEX_ et NA_CHARACTER_ *


Ceci est un peu stupide de r, non? Dans cet exemple de jouet, vous pouvez simplement faire comme (na, classe (x)) mais dans une situation où vous ne savez pas si la valeur de résultat serait entier ou < code> double , par exemple ce qui est à faire


Si vos données sont de classe entier , il retournera na_integer , s'il s'agit d'un double, il sera alors numérique classe et retournera < Code> na_real _ . La plupart du temps que vous ne vous souciez pas, et plus les approches de données.Toutiez-vous ne vous obligent pas à spécifier


yeh, mais dans mon cas particulier, ce qui se passe, c'est que des choses dans mon f sont converties en un XTS , certains calculs effectués et une réponse renvoyée. Donc, je ne peux pas utiliser votre suggestion malheureusement. J'ai fini par supprimer les valeurs na de la valeur de retour dans mon cas d'utilisation.


Poster un petit exemple de votre fonction et de vos données réelles, nous pourrions alors aborder votre problème


Il y a quelques scans vecteur ( == dans i ) ici qui semblent être destinés à une recherche binaire? En outre, j'ai voté de fermer en tant que DUP (voir autre question), mais peut-être que @Alex pourrait mettre à jour le titre de la question, car : = semble également approprié et il y a de bonnes informations dans cette réponse.


@mnel, puisque vous saisissez dt sur A , la vitesse maximale de cet exemple simple semble être obtenue à l'aide de DT [J (9), A: = na_integer_] `? Peut-être que c'est un point discutable étant donné le commentaire précédent de l'OP, cependant.


Correction du problème de recherche binaire. Je pensais que j'avais essayé ça et cela avait lancé une erreur. La recherche binaire gagne de loin!



0
votes

Vous pouvez également faire quelque chose comme ceci:

new.dtb <- data.table(mat)
new.dtb
     a
 1:   1
 2:   2
 3:   3
 4:   4
 5:   5
 6:   6
 7:   7
 8:   8
 9:  NA
10:  10


0 commentaires

-1
votes

Si vous souhaitez attribuer NAS à de nombreuses variables, vous pouvez utiliser l'approche Adressement suggérée ici : xxx < / pré>


0 commentaires