Concebir
En cuanto al lenguaje R, quiero escribirlo en tres partes.
-
Resumen de conocimientos básicos. Haga clic aquí para saltar
-
Resumen de gráficos comunes. Haga clic aquí para saltar
-
Resumen de métodos comunes de análisis estadístico. Haga clic aquí para saltar
escribir delante
Debido a que esta es la primera vez que aprendo el lenguaje R, es inevitable que haya deficiencias. Tengan paciencia conmigo. Este documento se actualizará a tiempo y se agregarán algunas ideas personales.
Si tienes alguna duda, puedes comentar directamente o contactar conmigo. Por supuesto, el requisito previo para responder es¡Eres un poco así!
De hecho, R no es el foco, y mucho menos el punto final. R es mucho mejor que Python, C++ y Java, ¿verdad? R no requiere un examen, solo requiere que resuelvas problemas.
La cuestión es,Tienes que tener una idea., necesita saber qué problemas encuentra y encontrar soluciones a los problemas. Por ejemplo:
Si desea procesar Excel, debe abrirlo y buscar en Baidu.Cómo abrir Excel en lenguaje RSi tienes problemas, puedes resolverlos, hay muchos métodos en línea.
La solución correcta: Aaron, ¿por qué los archivos csv aparecen confusos cuando los escribo? (Vaya, Aaron puede manejar otro ERROR)
Solución incorrecta: Aaron, no sé cómo hacer esta tarea. Por favor, ayúdame a escribirla. . . (Nadie llama a Aaron a menos que le des dinero❤️)
Agradecimiento especial a: Profesor Yang Qingyong de la Escuela de Información
Referencia: Profesor Yang Qingyong PPT
¿Qué puede hacer el lenguaje R?
Cuando se trata de esto, la mayoría de la gente simplemente dice: haz un dibujo. Algunas personas también dirán analizar datos.
Aquí surge la pregunta: ¿Crees que el lenguaje R es un curso de agua? Solía pensar que sí y sentía que el lenguaje R no era importante, pero luego descubrí que era divertido.
De hecho, se trata de que los profesores sigan a las personas adecuadas y hagan las cosas correctas. Si sigues a la persona equivocada, será difícil hacer lo correcto.
En primer lugar, el lenguaje R no se limita al dibujo, por supuesto, es excelente para dibujar, al menos mucho mejor que Python.
En segundo lugar, hay muchos paquetes en R y hay muchas funciones escritas que podemos llamar, lo cual es muy conveniente para el análisis de datos e incluso el aprendizaje automático, y también es muy conveniente para pruebas y llamadas de modelos posteriores.
Creo que R no es la clave. La clave es el conocimiento teórico, especialmente el conocimiento del análisis estadístico. R es solo una herramienta y el problema es el más fundamental. Hay un dicho famoso en la industria informática:
El lenguaje es sólo una herramienta, el problema es el más fundamental.
Operaciones básicas
Cómo instalar y cargar paquetes en R
1. Paquete de instalación: entrada de línea de comando
install.packages("包的名字")
# 其实还有使用工具安装的,这个命令可以安装大部分包,其他个别的有问题都可以百度到解决方案
2. Cargue el paquete: ingréselo en la línea de comando o en el código.
library(包的名字) #不用写引号哦
Ver código de ayuda
?solve # 可以直接使用一个"?"来查看帮助文档
example(solve) # 使用example()来查看该函数的使用范例
help(solve) # 查看solve()函数的帮助文档
otro
help.start() # 查看全部帮助文档,或者进入http://127.0.0.1:27003/doc/html/index.html
??solve # 查看某一确定的关键字内容文档,使用两个问号"??"
producción
print no puede especificar sep, pero cat sí
print("我爱帅帅龙");
cat("我爱","帅帅龙",sep="love");
Concatenación de cadenas
Se puede especificar sep para devolver la cadena concatenada, y los tipos que no son cadenas se convierten automáticamente en cadenas.
a = paste("我爱","帅帅龙",1,"万年")
Otras operaciones comunes
ctrl+L # 清屏
rm(list=ls()) # 清除内存空间
getwd() # 查看工作目录
setwd() # 设置临时目录
código de prueba
dibujar corazon chino
library("fun")
library("rgl")
demo("ChinaHeart2D")
demo("ChinaHeart3D")
nube de palabras
library(wordcloud2)
wordcloud2(demoFreq)
wordcloud2(demoFreqC)
gramática básica
Asignación
a = 10;# 我个人喜欢这样,新版本兼容很好,大家不用想太多,直接冲就完事了
b <- 10;# 中规中矩的赋值,表示流向,数据流向变量,也可以写成10 -> b
Crear vectores irregulares
No te preocupes por lo que es un vector, simplemente trátalo como un contenedor, similar a la lista de Python.
a = c("我","爱","帅帅龙")
Crear vectores con ciertas reglas.
Rep significa repetir, lo que significa repetición.
x <- seq(1, 10, by = 0.5) # 得到1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5 6.0 6.5 7.0 7.5 8.0 8.5 9.0 9.5 10.0
x <- seq(1, 10, length = 21) # 从1到10,得到21个等间距数
x <- rep(2:5, 2) # 得到2 3 4 5 2 3 4 5
x <- rep(2:5, rep(2, 4)) # 得到2 2 3 3 4 4 5 5
Crea un vector continuo de números.
a = c(1:5) # 可以得到1 2 3 4 5
operador
De hecho, no hay nada interesante que leer a partir de ahora, se recomienda no leer esta parte, solo búsquela nuevamente cuando encuentre problemas o mire hacia atrás.
数值运算符
+ - * /
^ # 乘方
%% # 求余
%/% # 整除
关系运算符
> < == != >= <=
逻辑运算符
&& || !
其他运算符
: # 冒号运算符,用于创建一系列数字的向量。
%in% # 用于判断元素是否在向量里,返回布尔值,有的话返回 TRUE,没有返回 FALSE。
%*% # 用于矩阵与它转置的矩阵相乘。
Funciones matemáticas
Algunas funciones matemáticas comunes son:
función | ilustrar |
---|---|
raíz cuadrada (n) | raíz cuadrada de n |
exp(n) | La constante natural e elevada a la enésima potencia, |
iniciar sesión(m,n) | La función logarítmica de n, devuelve la potencia de n igual a m |
registro10(m) | Equivalente a log(m,10) |
La función de ronda en R puede "redondear cinco" en algunos casos. Cuando la cifra de redondeo sea un número par, también se redondeará cinco.
nombre | modelo paramétrico | significado |
---|---|---|
redondo | (norte) | Ronda norte |
redondo | (norte, metro) | Redondear n a m decimales |
techo | (norte) | Redondear y subir |
piso | (norte) | Redondear hacia abajo |
Funciones trigonométricas
levemente
Generar letras mayúsculas y minúsculas
a = letters[1:4] # letters为生成指定范围个小写字母向量。
b = LETTERS[1:4] # LETTERS为生成指定范围个大写字母向量。
Los valores faltantes se convierten a 0.
x [!is.na(x)]=0
Constantes comunes
- 26 LETRAS MAYÚSCULAS
- 26 letras minúsculas
- Abreviatura del mes mes.abb
- Nombre del mesnombre.mes
- valor pi
Intercambiar números y cadenas.
Convertir cadena a tipo numérico
as.integer("12.3") # 字符串转整数,得到12
as.double("11.666") # 字符串转小数,得到11.666
Convertir tipo numérico a texto
Usar pegar()
a = paste(1) #
formatC() genera valores como cadenas
formatC(1/3, format = "e", digits = 4) # digits表示小数点位数
formatC(1/3, format = "f", digits = 4)
como.carácter()
a=as.character(66)
control de procesos
si declaración
x <- 50L
if(is.integer(x)) {
print("X 是一个整数")
} else {
print("X 不是一个整数")
}
el interruptor no introduce
mientras bucle
a = 1
while(a<5){
print('hello')
}
en bucle
El lenguaje R es particularmente difícil de procesar para bucles. Bueno, es difícil de todos modos. No sé por qué.
a = c([1:4])
for(i in a){
print(i)
}
repetir bucle
Repetir significa repetir.
a = 1
sum = 0
repeat{
if(sum>10){
break # break终止循环,next继续下一次循环,就好像c++或python的continue
}
sum=sum+a
a=a+1
}
print(sum)
Estructuras de datos comunes
Hermano Meng, ¡vamos al grano! ! !
Vector:c()
Por desgracia, ¿qué es exactamente un vector? De hecho, puede entenderse simplemente como una lista de Python, pero de hecho hay una implementación de lista en R, que se llama lista, y puede almacenar diferentes tipos.
Características:
- Solo se puede almacenar un tipo de elemento, si hay números y cadenas, se convertirán automáticamente en cadenas.
- Puede usar el índice para obtener elementos (el índice comienza desde 1)
- Puede utilizar la operación de corte para interceptar un fragmento, y ambos extremos son intervalos cerrados.
Crear vector
La gramática básica ya se ha mencionado antes.
Agregar valor usando anexar
good_sample_p <- append(good_sample_p,p)
Operaciones de suma, resta, multiplicación y división de vectores
Una cosa interesante es la regla de reciclaje de vectores, como a = c (1,2,3), b = c (4,5), en este momento, si se usa a + b, aparecerá un mensaje de advertencia, pero no reportará ningún error.
Tomemos como ejemplo a+b: en realidad es (1+4, 2+5, 3+4), ahora entiendes qué es el reciclaje.
Algunas funciones comúnmente utilizadas
- sqrt(x), log(x), exp(x), sin(x), cos(x), tan(x), abs(x) representan raíces cuadradas, logaritmos, exponenciales, funciones trigonométricas y valores absolutos respectivamente. .
- sort(x, decreciente=FALSE) devuelve un vector resultante ordenado de pequeño a grande por los elementos de x.
- order(x) es un vector de subíndices de elementos tales que x está ordenado de pequeño a grande
- ordenar(x) es equivalente a x[orden(x)]
- numérico (n): representa un vector cero de longitud n
- all(log(10 * x) > x): determina si un vector lógico es verdadero
- any(log(10 * x) > x): determina si existe un valor verdadero
- is.na(c(1, 2, NA)): determina si cada elemento de x es un valor faltante
vector lógico
Los vectores pueden tomar valores lógicos, como
y <- c(TRUE, TRUE, FALSE)
x = c(1, 4, 6.25)
y = x > 3
# y的值是
[1] FALSE TRUE TRUE
También se pueden comparar dos vectores.
x = c(1, 4, 6.25)
log(10 * x)
[1] 2.302585 3.688879 4.135167
log(10 * x) > x
[1] TRUE FALSE FALSE
比较运算符:<,<=,>,>=,==(相等),!=(不等)
逻辑向量可以进行与(&)[表示同时满足],或(|)[两者之一]运算.
También puede forzar que el valor lógico se convierta en un valor entero, como por ejemplo: VERDADERO se convierte en 1, FALSO se convierte en 0,
x = c(1, 4, 6.25)
c(0, 1)[(x > 3) + 1] # 下面我会对这句话解释一下
[1] 0 1 1
(x>3)+1
[1] 1 2 2
Explicaré esta línea de código c(0, 1)[(x > 3) + 1] aquí.
(x > 3) obtendrá el vector lógico [F ,T ,T]
(x>3)+1 forzará el valor lógico a un valor entero para obtener [1,2,2]
Luego úselo como índice del vector anterior, c(0,1), para obtener [0,1,1]
vector de caracteres
Es decir, hay caracteres en el vector (¿No es muy sencilla esta explicación?)
a = c("我爱",'帅帅龙') # 如果同时出现了字符串和数字,数字会转为字符串的哦
La función pegar se usa para concatenar sus variables independientes en cadenas, usando los delimitadores correspondientes en el medio. Se ha introducido el empalme de cadenas anterior, ¿de acuerdo?
vector complejo
No se usa mucho, entonces, ¿por qué no simplemente... no lo presentamos, está bien?
índice vectorial
Hermano lindo! ¡Despierta, esto es muy importante!
Los subíndices de vectores en R comienzan desde 1, lo cual es inconsistente con el software estadístico o matemático común. ¡Los subíndices de vectores en lenguaje C, Python y otros lenguajes de programación comienzan desde 0!
No te dejes llevar por Python: el índice negativo de R indica qué elemento eliminar.
x = c(42, 7, 64, 9)
x[2] # 访问第2个元素
x[3] = -1 # 修改第三个数据的值
x[-4] # 删除第四个元素
x[x < 10] # 表示选取x<10的元素
x[c(1, 4)] # 向量索引,是不是很神奇?
Al definir un vector, puede agregar nombres a los elementos.
ages <- c(Li = 23, Zhang = 33, Wang = 45)
# ages为
Li Zhang Wang
23 33 45
# 访问时可以用通常的方法,还可以用元素名访问
ages["Zhang"]
# 还可以定义向量后,再后加上名字
age1 = c(21, 34, 56)
names(age1) = c("Zhang", "Ding", "Liu")
matriz:matriz
matriz (datos = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)
- Los datos son los datos de la matriz, generalmente un vector.
- nrow es el número de filas, ncol es el número de columnas
- Cuando byrow es VERDADERO, será 1, 2, 3, 4 horizontalmente; de lo contrario, será 1, 2, 3 verticalmente.
Crear matriz
matrix(1:12,ncol=4,byrow=TRUE)
# 得到的数据
[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
[2,] 5 6 7 8
[3,] 9 10 11 12
Funciones de uso común
-
head(a,10) Ver las primeras 10 filas de la matriz
-
tail(a,10) Ver las últimas diez filas de la matriz
-
cbind(): fusionar arriba y abajo
-
rbind(): fusionar izquierda y derecha
-
c(A): Muestra todos los vectores de A, que son vectores enderezados por columnas.
-
det(A): Encuentra el valor del determinante
-
resolver(A): encontrar la inversa
-
eigen(A): valores propios y vectores propios
B=rbind(c(1,2),c(3,4))
C=cbind(c(11,12),c(13,14))
D=rbind(B,C)
E=cbind(B,C)
Operaciones matriciales
Similar a la suma, resta, multiplicación y división de vectores.
Las operaciones participantes generalmente tienen la misma forma, y también se pueden usar vectores y matrices con formas inconsistentes para cuatro operaciones aritméticas. La regla es que los datos de la matriz se operan sobre los elementos correspondientes del vector (enderezados por columnas).
Acceder a elementos y submatrices de matrices.
- A[2,3]# acceso es el (2,3) elemento 7 de la matriz
- A[i,] #Accede a la i-ésima fila, A[,j] #Accede a la j-ésima columna
- A[,c(1,2,3)] primeras tres columnas
- A[,c('nombre1','nombre2')] especifica el nombre de la columna
Cambie el nombre de las etiquetas de filas y columnas de la matriz.
rownames(A) <- c("a", "b", "c")
colnames(A) <- paste("X", 1:4, sep="")
aplicar función
Si desea realizar algún cálculo en una determinada fila (columna) de una matriz, puede utilizar la función de aplicación: aplicar (x, margen, diversión,…)
x representa la matriz, margen = 1 representa el cálculo para cada fila, margen = 2 representa el cálculo para cada columna y diversión es la función utilizada para el cálculo.
apply(A, 1, sum)
apply(A, 2, mean)
factor: factor
factor(x, niveles = ordenar(único(x), na.last = VERDADERO), etiquetas, excluir = NA, ordenado = FALSO)
Se utiliza para codificar un vector en un factor.
Crear factores
sex = c("M","F","M","M","F")
sexf = factor(sex);sexf
Funciones de uso común
- is.factor() comprueba si el objeto es un factor
- as.factor() convierte vectores en factores
- Los niveles (x) pueden obtener los niveles de los factores.
- La tabla (x) cuenta la frecuencia de varios tipos de datos.
función tapply()
tapply(x, ÍNDICE, DIVERSIÓN=NULL,…,simplificar=VERDADERO)
- x es un objeto, generalmente un vector
- ÍNDICE es un factor con la misma longitud que X
- FUN es la función a calcular
Conociendo el sexo de 5 estudiantes y también la altura de estos 5 estudiantes, encuentre la altura promedio de los grupos.
sex = c("M","F","M","M","F")
height = c(174, 165, 180, 171, 160)
tapply(height, sex, mean)
función gl()
gl(n, k, longitud = n*k, etiquetas = seq_len(n), ordenado = FALSO)
gl() se puede utilizar para generar factores convenientemente
- n es el número de niveles
- k es el número de repeticiones
- longitud es la longitud del resultado
- etiquetas es un vector n-dimensional que representa niveles de factores
- ordenado es una variable lógica que indica si es un factor ordenado, el valor predeterminado es FALSO.
Lista: lista
Crear lista
rec <- list(name="黎明", age=30, scores=c(85,76,90));rec
# 得到的数据
$name
[1] "黎明"
$age
[1] 30
$scores
[1] 85 76 90
Citar y modificar listas
Se puede hacer referencia a los elementos de la lista con "nombre de lista [[subíndice]]". Las listas son diferentes de los vectores. Sólo se puede hacer referencia a un elemento a la vez. Por ejemplo, rec[[1:2]] no está permitido.
rec <- list(name="黎明", age=30, scores=c(85,76,90));rec
rec[[2]] # 得到30
rec[[3]][2] # 得到第三个元素的第二个元素,即76
# 若指定了元素的名字,则引用列表元素还可以用它的名字作为下标,
rec$age
rec[["age"]]
rec[[2]]=11 # 把30修改为11
Nota: Se permite el uso de "nombre de lista [subíndice]" o "nombre de lista [rango de subíndice]", pero a diferencia del significado anterior, sigue siendo una lista.
Marco de datos: marco.de.datos
Muchos puntos importantes
Un marco de datos suele ser una matriz de datos, pero las columnas de una matriz pueden ser de diferentes tipos. Cada columna del marco de datos es una variable y cada fila es una observación.
Esto es similar al DataFrame en los pandas de Python.
Generar marco de datos
d = data.frame(name=c('黎明','周杰伦','刘德华'),age=c(30,35,28),height=c(180,175,173))
# d的值
name age height
1 黎明 30 180
2 周杰伦 35 175
3 刘德华 28 173
as.data.frame(list) puede convertir la lista en data.frame(), porque la lista no puede especificar un nombre.
Referencia del marco de datos
d = data.frame(name=c('黎明','周杰伦','刘德华'),age=c(30,35,28),height=c(180,175,173))
d[1:2, 2:3] # 得到前两行,2,3列的数据
d[["age"]] # 获取age这一列的数据
# 等价于
d$height # 获取height这一列的数据
rownames(d) = c("one", "two", "three") # 各行也可以定义名字,指定index
Modificar valor
d$name[1] = "我爱你" #将name的第一个值修改为我爱你 常用
d[1,2] = "女" #将第1行第2列的值修改为“女” 常用
d[[1]][2] = "我爱你" #将第一列第二个值改为“我爱你”
Agregar y eliminar filas y columnas
d = df1[-2,] #删除第2行数据
d = df1[,-3] #删除第3列的数据
d = df1[-c(1,3),] #删除第1行和第3行的数据
d$r = age/weight # 添加列r
función adjuntar ()
R proporciona la función adjuntar() para transferir variables a la memoria. Al igual que nuestro d$height o d[["age"]], no necesitas escribirlo así. Solo escribe edad directamente. ¿No es genial?
d = data.frame(name=c('黎明','周杰伦','刘德华'),age=c(30,35,28),height=c(180,175,173))
attach(d)
r <- age/height # /对r进行修改不会影响d的数据
# r的值
[1] 0.1666667 0.2000000 0.1618497
detach(d) #取消连接
unir()
Fusionar múltiples marcos de datos en un solo marco de datos
merge(data1, data2, by='ID')
Manejo de excepciones tryCatch()
Al igual que la mayoría de los lenguajes de programación, no entraré en detalles aquí. Lo que necesitas saber es que hay otra cosa llamada withCallingHandlers().
withCallingHandlers() es una variante de tryCatch(), pero las condiciones de contexto de la operación son diferentes, rara vez se usa, pero es muy útil.
Leer y guardar datos
Leer texto: read.table()
leer.tabla(“nombredearchivo.txt”)
Leer xlsx: leer.xlsx()
Primero debe instalar el paquete xlsx y luego importarlo.
datos <- read.xlsx(“nombre de archivo.xlsx”,n)
Guardar csv: escribir.csv()
write.csv(datos,archivo = "nombre de archivo")
Ejemplo xlsx: write.xlsx()
escribir.xlsx(datos, “datos.xlsx”,hoja.nombre=“hoja1”)
Guardar como imagen o archivo pdf en R
Tome png como ejemplo
png(file="myplot.png", bg="transparent") #文件不指定地址,默认放在getwd()里了
# 这里写你的画图程序#
dev.off() # 记得off
# 下面是一个实例
png(file="myplot.png")
plot(1:10)
rect(1, 5, 3, 7)
dev.off()
Si lo guarda como jpeg o pdf, simplemente cámbielo a png.
Algunas funciones comunes de R
Hermano Meng, prepárese. Recuerde estas cosas primero. Vamos a comenzar a hacer dibujos y analizar estadísticas.
Glosario
media, mediana, moda
No, no, no, de verdad hay gente que no sabe lo que significan estas tres palabras. . .
diferencia
La varianza (varianza de la muestra) es el promedio de las diferencias al cuadrado entre cada valor de muestra y la media de todo el valor de la muestra.
Desviación Estándar
De forma predeterminada, utilizamos la desviación estándar de la población, que es la raíz cuadrada de la varianza.
distribución normal
La curva normal tiene forma de campana, baja en ambos extremos, alta en el medio y simétrica. Debido a que la curva tiene forma de campana, la gente suele llamarla curva en forma de campana.
Si la variable aleatoria X obedece a una distribución normal con expectativa matemática μ y varianza σ^2, se registra como N(μ, σ^2). (La expectativa es Σxn*pn, xn representa la frecuencia y pn representa la probabilidad)
Su función de densidad de probabilidad es una distribución normal. El valor esperado μ determina su posición y su desviación estándar σ determina la amplitud de la distribución. La distribución normal cuando μ = 0, σ = 1 es la distribución normal estándar.
Con respecto al significado de distribución normal, puede hacer clic aquí como referencia.
media: obtener la media
a=c(1:6)
mean(a)
mediana: obtenga la mediana
a=c(1:6)
median(a)
Obtener el modo
No existe una función especial en el lenguaje R para obtener el modo, por lo que debes escribirlo a mano.
# 创建函数
getmode = function(v) {
uniqv = unique(v) # unique主要是返回一个把重复元素或行给删除的向量、数据框或数组
uniqv[which.max(tabulate(match(v, uniqv)))]
}
# 创建向量
v = c(2,1,2,3,1,2,3,4,1,5,5,3,2,3)
# 调用函数
result = getmode(v)
print(result)
cuantil(): percentil, el valor predeterminado es 5
a=c(1:6)
quantile(a)
# 得到的结果
> quantile(a)
0% 25% 50% 75% 100%
1.00 2.25 3.50 4.75 6.00
resumen (): estadísticas descriptivas
resumen(): Obtiene estadísticas descriptivas, que pueden proporcionar el valor mínimo, valor máximo, cuartil y valor medio de variables numéricas, así como estadísticas de frecuencia de vectores de factores y vectores logísticos, etc.
Los resultados se interpretan de la siguiente manera:
a=c(1:6)
summary(a)
# 得到的结果
> summary(a)
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.00 2.25 3.50 3.50 4.75 6.00
var(): Calcular la varianza
a = c(1:5)
var(a)
sd(): desviación estándar
a = c(1:5)
sd(a)
coeficiente de variación
Varianza dividida por la media
Cuando necesita comparar el grado de dispersión de dos conjuntos de datos, si las escalas de medición de los dos conjuntos de datos son demasiado diferentes o las dimensiones de los datos son diferentes, no es apropiado utilizar directamente la desviación estándar para comparar. podemos utilizar el coeficiente de variación.
ordenar, ordenar: ordenar, especificar reglas de clasificación
x = c(1,7,5,4,4,6,9)
x = sort(x,decreasing=FALSE) # 返回升序排列结果,当decreasing为TRUE时为降序排列
# 或者
x_order = order(x,decreasing=FALSE) # 返回升序后的下标, decreasing为TRUE时为降序排列
x = x[x_order]
Para ordenar una matriz
x[orden(x[,1],x[,2]),]
Nota: Para orden descendente, simplemente agregue el parámetro decreciente.
Manejo de valores faltantes
Para los valores de NA, algunos cálculos se guardarán. Necesitamos ignorar NA y agregar los siguientes parámetros: na.rm=TRUE, por ejemplo
mean(height,na.rm=TRUE)
[1] 5.855
cor(): Calcula el coeficiente de correlación entre dos variables (opcional)
cor(height,log(height))
cov(): covarianza entre dos variables (opcional)
cov(height,log(height))
shapiro.test(): determina si los datos satisfacen la distribución normal
En términos generales, cuando el valor p devuelto es mayor que 0,05, se cumple.
Por supuesto, hay circunstancias especiales, jaja, porque en la mayoría de los casos de investigación científica, 0,05 no es riguroso y puede designarse como 0,01. Si la pregunta no especifica alfa, el valor predeterminado es 0,05.