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'
3 Réponses :
de 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 Cela pourrait faire plus de données.Table sens d'utiliser ? na code>
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>
plus data.table * approche * ish * approche h1 >
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
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 code> ..
Regardez ? Na code> (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)) code> mais dans une situation où vous ne savez pas si la valeur de résultat serait
entier code> ou < code> double code>, par exemple ce qui est à faire
Si vos données sont de classe entier code>, il retournera
na_integer code>, s'il s'agit d'un double, il sera alors
numérique code> classe et retournera < Code> na_real _ code>. 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 code> sont converties en un
XTS code>, 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 code> 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 ( == code> dans
i code>) 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
: = code> semble également approprié et il y a de bonnes informations dans cette réponse.
@mnel, puisque vous saisissez dt code> sur
A code>, 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!
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
Si vous souhaitez attribuer NAS à de nombreuses variables, vous pouvez utiliser l'approche Adressement suggérée ici :
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.