Assumer le tableau suivant:
data <- data.table(dummy=1:10)
Je sais que vous pouvez faire les choses suivantes:
data[dummy < 5, c("test1", "test2") := list("Yes", 1)]
et:
data[, test1 := fcase(dummy < 5, "Yes")]
data[, test2 := fcase(dummy < 5, 1)]
Je suis en train de les combiner en une seule, comme ceci:
data[, c("test1", "test2") := fcase(dummy < 5, list("Yes", 1))]
Mais il me donne l'erreur suivante:
Error in fcase(dummy < 5, list("Yes", 1)) :
Length of output value #2 must either be 1 or length of logical condition.
J'ai besoin d'aller à travers de multiples filtres il est donc logique d'utiliser fcase
. Je peux toujours recourir à l'aide de la première solution pour chaque filtre comme ceci:
data[dummy < 5, c("test1", "test2") := list("Yes", 1)]
data[dummy > 7, c("test1", "test2") := list("No", 0)]
data[between(dummy, 5, 7), c("test1", "test2") := list("Maybe", NA)]
mais je me demande si il n'y a pas quelque chose de plus possible. Il y a aussi la solution de la création d'un tableau avec chaque combinaison de test1
et test2
et de fusion de ce tableau avec le tableau de données après avoir fait une fcase
pour seulement test1
comme suit:
tests <- data.table(test1 = c("Yes", "No", "Maybe"),
test2 = c(1, 0, NA))
data[, test1 := fcase(dummy < 5, "Yes",
dummy > 7, "No",
between(dummy, 5, 7), NA_character_)]
merge(data, tests, by = "test1", all.x = T, sort = F)
Mais ce qui semble inefficace pour une grande et complexe datatable