manipulation - recodificar variables en r studio
Obtener tipo de todas las variables (5)
Cómo obtener el tipo de variable cuando se oculta debajo de un objeto global:
Todo lo que necesita está en el manual de R sobre tipos básicos: https://cran.r-project.org/doc/manuals/R-lang.html#Basic-types
Su object()
debe ser penetrado con get(...)
antes de poder ver el interior. Ejemplo:
a <- 10
myGlobals <- objects()
for(i in myGlobals){
typeof(i) #prints character
typeof(get(i)) #prints integer
}
Cómo obtener el tipo de variable que tiene en R
El tipo de función R tiene un sesgo para darle el tipo a la profundidad máxima, por ejemplo.
library(tibble)
#expression notes type
#----------------------- -------------------------------------- ----------
typeof(TRUE) #a single boolean: logical
typeof(1L) #a single numeric with L postfixed: integer
typeof("foobar") #A single string in double quotes: character
typeof(1) #a single numeric: double
typeof(list(5,6,7)) #a list of numeric: list
typeof(2i) #an imaginary number complex
#So far so good, but those who wish to keep their sanity go no further
typeof(5 + 5L) #double + integer is coerced: double
typeof(c()) #an empty vector has no type: NULL
typeof(!5) #a bang before a double: logical
typeof(Inf) #infinity has a type: double
typeof(c(5,6,7)) #a vector containing only doubles: double
typeof(c(c(TRUE))) #a vector of vector of logicals: logical
typeof(matrix(1:10)) #a matrix of doubles has a type: list
#Strangeness ahead, there be dragons: step carefully:
typeof(substr("abc",2,2))#a string at index 2 which is ''b'' is: character
typeof(c(5L,6L,7L)) #a vector containing only integers: integer
typeof(c(NA,NA,NA)) #a vector containing only NA: logical
typeof(data.frame()) #a data.frame with nothing in it: list
typeof(data.frame(c(3))) #a data.frame with a double in it: list
typeof(c("foobar")) #a vector containing only strings: character
typeof(pi) #builtin expression for pi: double
#OK, I''m starting to get irritated, however, I am also longsuffering:
typeof(1.66) #a single numeric with mantissa: double
typeof(1.66L) #a double with L postfixed double
typeof(c("foobar")) #a vector containing only strings: character
typeof(c(5L, 6L)) #a vector containing only integers: integer
typeof(c(1.5, 2.5)) #a vector containing only doubles: double
typeof(c(1.5, 2.5)) #a vector containing only doubles: double
typeof(c(TRUE, FALSE)) #a vector containing only logicals: logical
#R is really cramping my style, killing my high, irritation is increasing:
typeof(factor()) #an empty factor has default type: integer
typeof(factor(3.14)) #a factor containing doubles: integer
typeof(factor(T, F)) #a factor containing logicals: integer
typeof(Sys.Date()) #builtin R dates: double
typeof(hms::hms(3600)) #hour minute second timestamp double
typeof(c(T, F)) #T and F are builtins: logical
typeof(1:10) #a builtin sequence of numerics: integer
typeof(NA) #The builtin value not available: logical
#The R coolaid punchbowl has been spiked: stay frosty and keep your head low:
typeof(c(list(T))) #a vector of lists of logical: list
typeof(list(c(T))) #a list of vectors of logical: list
typeof(c(T, 3.14)) #a vector of logicals and doubles: double
typeof(c(3.14, "foo")) #a vector of doubles and characters: character
typeof(c("foo",list(T))) #a vector of strings and lists: list
typeof(list("foo",c(T))) #a list of strings and vectors: list
typeof(TRUE + 5L) #a logical plus an integer: integer
typeof(c(TRUE, 5L)[1]) #The true is coerced to 1 integer
typeof(c(c(2i), TRUE)[1])#logical coerced to complex: complex
typeof(c(NaN, ''batman'')) #NaN''s in a vector don''t dominate: character
typeof(5 && 4) #doubles are coerced by order of && logical
typeof(8 < ''foobar'') #string and double is coerced logical
typeof(list(4, T)[[1]]) #a list retains type at every index: double
typeof(list(4, T)[[2]]) #a list retains type at every index: logical
typeof(2 ** 5) #result of exponentiation double
typeof(0E0) #exponential lol notation double
typeof(0x3fade) #hexidecimal double
typeof(paste(3, ''3'')) #paste promotes types to string character
typeof(3 + 四) #R pukes on unicode error
typeof(iconv("a", "latin1", "UTF-8")) #UTF-8 characters character
typeof(5 == 5) #result of a comparison: logical
Cómo obtener la clase de una variable que tienes en R
La class
función R tiene un sesgo para darle el tipo de contenedor o estructura que encapsula sus tipos, por ejemplo.
library(tibble)
#expression notes class
#--------------------- ---------------------------------------- ---------
class(matrix(1:10)) #a matrix of doubles has a class: matrix
class(factor("hi")) #factor of items is: factor
class(TRUE) #a single boolean: logical
class(1L) #a single numeric with L postfixed: integer
class("foobar") #A single string in double quotes: character
class(1) #a single numeric: numeric
class(list(5,6,7)) #a list of numeric: list
class(2i) #an imaginary complex
class(data.frame()) #a data.frame with nothing in it: data.frame
class(Sys.Date()) #builtin R dates: Date
class(sapply) #a function is function
class(charToRaw("hi")) #convert string to raw: raw
class(array("hi")) #array of items is: array
#So far so good, but those who wish to keep their sanity go no further
class(5 + 5L) #double + integer is coerced: numeric
class(c()) #an empty vector has no class: NULL
class(!5) #a bang before a double: logical
class(Inf) #infinity has a class: numeric
class(c(5,6,7)) #a vector containing only doubles: numeric
class(c(c(TRUE))) #a vector of vector of logicals: logical
#Strangeness ahead, there be dragons: step carefully:
class(substr("abc",2,2))#a string at index 2 which is ''b'' is: character
class(c(5L,6L,7L)) #a vector containing only integers: integer
class(c(NA,NA,NA)) #a vector containing only NA: logical
class(data.frame(c(3))) #a data.frame with a double in it: data.frame
class(c("foobar")) #a vector containing only strings: character
class(pi) #builtin expression for pi: numeric
#OK, I''m starting to get irritated, however, I am also longsuffering:
class(1.66) #a single numeric with mantissa: numeric
class(1.66L) #a double with L postfixed numeric
class(c("foobar")) #a vector containing only strings: character
class(c(5L, 6L)) #a vector containing only integers: integer
class(c(1.5, 2.5)) #a vector containing only doubles: numeric
class(c(TRUE, FALSE)) #a vector containing only logicals: logical
#R is really cramping my style, killing my high, irritation is increasing:
class(factor()) #an empty factor has default class: factor
class(factor(3.14)) #a factor containing doubles: factor
class(factor(T, F)) #a factor containing logicals: factor
class(hms::hms(3600)) #hour minute second timestamp hms difftime
class(c(T, F)) #T and F are builtins: logical
class(1:10) #a builtin sequence of numerics: integer
class(NA) #The builtin value not available: logical
#The R coolaid punchbowl has been spiked: stay frosty and keep your head low:
class(c(list(T))) #a vector of lists of logical: list
class(list(c(T))) #a list of vectors of logical: list
class(c(T, 3.14)) #a vector of logicals and doubles: numeric
class(c(3.14, "foo")) #a vector of doubles and characters: character
class(c("foo",list(T))) #a vector of strings and lists: list
class(list("foo",c(T))) #a list of strings and vectors: list
class(TRUE + 5L) #a logical plus an integer: integer
class(c(TRUE, 5L)[1]) #The true is coerced to 1 integer
class(c(c(2i), TRUE)[1])#logical coerced to complex: complex
class(c(NaN, ''batman'')) #NaN''s in a vector don''t dominate: character
class(5 && 4) #doubles are coerced by order of && logical
class(8 < ''foobar'') #string and double is coerced logical
class(list(4, T)[[1]]) #a list retains class at every index: numeric
class(list(4, T)[[2]]) #a list retains class at every index: logical
class(2 ** 5) #result of exponentiation numeric
class(0E0) #exponential lol notation numeric
class(0x3fade) #hexidecimal numeric
class(paste(3, ''3'')) #paste promotes class to string character
class(3 + 四) #R pukes on unicode error
class(iconv("a", "latin1", "UTF-8")) #UTF-8 characters character
class(5 == 5) #result of a comparison: logical
Obtenga el storage.mode
de storage.mode
de su variable
Cuando se escribe una variable R en el disco, el diseño de los datos vuelve a cambiar y se denomina storage.mode
los datos . La función storage.mode(...)
revela esta información de bajo nivel: vea los objetos Modo, Clase y Tipo de R. No debería tener que preocuparse por el modo de almacenamiento de R a menos que esté tratando de comprender las demoras causadas por las expulsiones / coacciones de ida y vuelta que se producen al asignar y leer datos hacia y desde el disco.
Ideología sobre el sistema de tipaje de la tríada de R:
El sistema de tipado de patos de R tiene incertidumbre. Como una analogía, considere una taza de cerámica, puede usarse para contener un líquido o usarse como un proyectil como una pelota de béisbol. El propósito de la taza depende de sus propiedades disponibles y de la función que actúa sobre ella. Esta fluidez de tipo permite un mayor margen de maniobra para que los programadores redirijan cualquier clase de salida de una función a otra, y R hará todo lo posible para intentar leer su mente y hacer algo razonable.
La idea es que cuando los programadores novatos escriben los programas R a través del movimiento browniano, como lo harán, intentan pasar un googah.blimflarg
a un vehicle.subspaceresponder(...)
. En lugar de vomitar un error de tipo, el programa R hace gimnasia para transformar el tipo y luego hacer algo sorprendentemente útil. El programador novato publica el código en su blog y dice "mira esto tremendo que hice con 3 líneas de código R! No tengo idea de cómo sabe qué hacer, pero lo hace".
En R, me gustaría recuperar una lista de variables globales al final de mi script e iterar sobre ellas. Aquí está mi código
#declare a few sample variables
a<-10
b<-"Hello world"
c<-data.frame()
#get all global variables in script and iterate over them
myGlobals<-objects()
for(i in myGlobals){
print(typeof(i)) #prints ''character''
}
Mi problema es que typeof(i)
siempre devuelve el character
aunque las variables a
y c
no sean variables de caracteres. ¿Cómo puedo obtener el tipo de variable original dentro del ciclo for?
Diseñado para hacer esencialmente lo contrario de lo que quería, aquí está uno de mis juguetes de herramientas:
lstype<-function(type=''closure''){
inlist<-ls(.GlobalEnv)
if (type==''function'') type <-''closure''
typelist<-sapply(sapply(inlist,get),typeof)
return(names(typelist[typelist==type]))
}
Necesitará utilizar get
para obtener el valor en lugar del nombre del personaje devuelto por ls
:
x <- 1L
typeof(ls())
[1] "character"
typeof(get(ls()))
[1] "integer"
Alternativamente, para el problema tal como se presenta, es posible que desee utilizar eapply
:
eapply(.GlobalEnv,typeof)
$x
[1] "integer"
$a
[1] "double"
$b
[1] "character"
$c
[1] "list"
Puede usar la clase (x) para verificar el tipo de variable. Si el requisito es verificar todas las variables tipo de marco de datos, se puede usar sapply (x, clase).
> mtcars %>%
+ summarise_all(typeof) %>%
+ gather()
mpg double
cyl double
disp double
hp double
drat double
wt double
qsec double
vs double
am double
gear double