10分钟让你了解R的基本数据操作:R 入门级 之 《R的数据操作》 -- 200418


title: “R的数据操作”
author: “HHTING”
output:
html_document:
df_print: paged
word_document: default
pdf_document:
keep_tex: yes
latex_engine: xelatex
header-includes: \usepackage{ctex}

R的数据操作

对象

R通过刻画对象的名称、内容和数据类型(属性)来运行。所有对象都存在两个内在属性:类型和长度。
类型是所有对象元素的基本种类,共四种,分别是数值型、字符型、复数型和逻辑性(“numeric”、“character”、“logical”、“complex”)。长度是对象中元素的数目。对象的类型和长度可分别通过函数mode和length获得。
A1 <- 5; 
B <- "hello, world";    
C <- TRUE;  
D <- 5i;    
A2 <- 1:5

mode(A1);   
mode(B);   
mode(C);   
mode(D);   
mode(A2)

length(A1);  
length(B); 
length(A2)
无论什么类型的数据,缺失数据总是用NA(不可用)来表示;对很大的数值则可用指数形式表示。R可以正确地表示无穷的数值,如用Inf和-Inf表示±∞,或者用NaN(非数字)表示不是数字的值。
N <- 1.2e34
N

x <- 1/0
x

exp(x)
exp(-x)

x - x
字符型的对象在输入值时需要加上双引号(或单引号)。如果需要引用双引号(或单引号),则需要加反斜杠\,才能以特殊的方式表现出来。
a <- "hello, \"world\" "
b <- 'Goodbye, \'see you\' tomorrow'

a
cat(a)

b
cat(b)

在文件中读写数据

使用getwd()获得工作目录,setwd()更改工作目录,dir()显示该目录下所有文件。如果操作的文件不在工作目录下,则必须给出其路径。read.table()创建一个数据框来读取目标文件。
getwd()
setwd('D:/WPS') # 注意用斜杠/
dir()

a <- read.table("data.csv")
a[1,]   # 第一行
a[,1]   # 第一列
scan()可以指定变量类型来创建不同的对象。
# b <- scan("data.csv", what = list("", 0, 0))
函数read.fwf可以用来读取文件中一些固定宽度格式的数据
# read.fwf(file, widths, sep="\t", as.is = FALSE,        skip = 0, row.names, col.names, n = -1, ...)

存储数据

调用write.table()在文件中写入一个对象,包括数据库、向量、矩阵……
write.table(a,file = "data.txt")
调用save()记录一组任意数据类型的对象,并使用选项ASCII=TRUE使得数据(工作空间)在不同的机器之间更简易转移。
a <- 12345
save(a, file = "a.RData")
# save.image() <==> save(list = ls(all = TRUE), file = ".RData")

生成数据

1、规则序列

# 从1到10的规则整数序列
a <- 1:10
b <- 1:10-1 # ':'运算符优先级大于'加减乘除'

# 从0到10、公差为2的等差序列
c <- seq(0, 10, 2)
d <- seq(by = 2, from = 0, to = 10)

# 直接输入从0到10、公差为2的等差序列
e <- c(0, 2, 4, 6, 8, 10)

# 使用键盘输入从0到10、公差为2的等差序列
f <- scan()
# 1: 0 2 4 6 8 10
# 7: 
# Read 6 items
# rep()创建所有元素都相同的向量
rep(1, 10)
# sequence()创建一系列连续的整数序列,每个序列都以给定参数的数值结尾
sequence(1:5)
sequence(c(5,1))
# gl(k, n, length = , table = c("", "", ...)): k:水平数/类别数 n:每个水平重复的次数 length:指定产生数据的个数 label:指定每个水平因子的名字
gl(3, 4)
gl(3, 4, length = 24, label = c("a", "b", "c"))
gl(3, 4, length = 25, label = c("a", "b", "c"))
# expand.grid()创建一个数据框,结果是把各参数的各水平完全搭配
expand.grid(height = c(1, 2, 3), weight = c(2, 3), sex=c("D", "F"))

随机序列

在统计学中产生随机数据是很有用的,R可以产生多种不同分布下的随机数序列。分布函数形式为rfunc(n, p1, p2, …),其中func指概率分布函数,n为生成数据的个数,p1, p2, . . .是分布的参数数值。
#Gaussian (normal) rnorm(n, mean=0, sd=1)
#exponential rexp(n, rate=1)
#gamma rgamma(n, shape, scale=1)
#Poisson rpois(n, lambda)
#Weibull rweibull(n, shape, scale=1)
#Cauchy rcauchy(n, location=0, scale=1)
#beta rbeta(n, shape1, shape2)
#‘Student’ (t) rt(n, df)
#Fisher–Snedecor (F) rf(n, df1, df2)
#Pearson (χ2) rchisq(n, df)
#binomial rbinom(n, size, prob)
#multinomial rmultinom(n, size, prob)
#geometric rgeom(n, prob)
#hypergeometric rhyper(nn, m, n, k)
#logistic rlogis(n, location=0, scale=1)
#lognormal rlnorm(n, meanlog=0, sdlog=1)
#negative binomial rnbinom(n, size, prob)
#uniform runif(n, min=0, max=1)
#Wilcoxon’s statistics rwilcox(nn, m, n), rsignrank(nn, n)
密度函数(dfunc(x,…)),累计概率密度函数(也即分布函数)(pfunc(x, …))和分位数函数(qfunc(p, …),0<p<1)
# pfunc() 和 qfunc()求统计假设检验中P值或临界值
# 显著性水平为5%的正态分布的双侧临界值
qnorm(0.05/2)
qnorm(1-0.05/2)

# 对于同一个检验的单侧临界值,根据备择假设的形式使用qnorm(0.05)或1 - qnorm(0.95)。
qnorm(0.05)
1 - qnorm(0.95)

# 一个检验的P值,比如自由度df = 1的χ2 = 3.84
1 - pchisq(3.84, 1)

使用对象

创建对象

向量(Vector):类型(mode);长度(length). 创建的向量中元素值取决于参数所指定的数据类型:
numeric()   # -> 0
logical()   # -> FALSE
character() # -> ""
因子(Factor):分类变量本身;变量不同的可能水平(可能不在数据中出现)
# factor(x = character(), levels, labels = levels,       exclude = NA, ordered = is.ordered(x), nmax = NA)
# levels 用来指定因子可能的水平(缺省值是向量x中互异的值);labels用来指定水平的名字;exclude表示从向量x中剔除的水平值;ordered是一个逻辑型选项用来指定因子的水平是否有次序。
factor(1:5)

factor(1:5, levels = 1:5)
factor(1:5, levels = 5:10)

factor(1:5, labels = c('a', 'b', 'c', 'd', 'e'))
# factor(1:5, labels = c('a', 'b', 'c', 'd', 'e', 'f'))  
    #'labels'不对;长度6应该是一或5
    
factor(1:5, labels = c('a', 'b', 'c', 'd'), exclude = 3)
# factor(1:5, labels = c('a', 'b', 'c', 'd', 'e'), exclude = 3)
    # 'labels'不对;长度5应该是一或4
factor(1:5, exclude = 4)

# 函数levels用来提取一个因子中可能的水平值
a <- factor(c(1,5), levels = 1:6)
矩阵(Matrix):维数dim(row, col)
# matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)

matrix(data = 6, nrow = 2, ncol = 3)
matrix(6, 2, 3)

matrix(1:6, 2, 3, byrow = TRUE)
matrix(1:6, 2, 3, FALSE)

# 给维数适当的赋值(初始值为NULL)
x <- 1:6
dim(x)  # NULL
dim(x) <- c(2, 3)
x
数据框(Data frame):数据框中的向量必须有相同的长度,如果其中有一个比其它的短,它将“循环”整数次(以使得其长度与其它向量相同).如果一个因子包含在一个数据框中,它必须和其中的向量有相同的长度。
a <- 1:4; b <- 5; c <- c(6,7); d <- 8:10
data.frame(a, b)
data.frame(a, c)
# data.frame(a, d)  # arguments imply differing number of rows: 4, 3
列表(List)
x <- 1:4; y <- 5:7
f1 <- list(x, y); f2 <- list(A=x, B=y)
names(f1); names(f2)
时间序列(Time-series)
# ts(data = NA, start = 1, end = numeric(), frequency = 1,   deltat = 1, ts.eps = getOption("ts.eps"), class = , names = )

ts(1:10, start = 1996)
ts(1:50, frequency = 12, start = c(1996, 11))
ts(1:10, frequency = 4, start = c(1996, 2))
ts(matrix(rpois(36, 5), 12, 3), start=c(1961, 1), frequency=12)

表达式(Expression):表达式类型的对象是R能够解释的字符序列。所有有效的命令都是表达式。一个命令被直接从键盘输入后,它将被R求值,如果是有效的则会被执行。在很多情况下,构造一个不被求值的表达式是很有用的:这就是函数expresssion要做 的。当然也可以随后用eval()对创建的表达式进行求值。
x <- 3; y <- 2.5; z <- 1
exp1 <- expression(x / (y + exp(z)))
exp1

eval(exp1)

对象的类型转换

as.numeric(); as.logical(); as.character(); as.data.frame(); as.ts(); as.expression(); …
相关介绍:https://blog.csdn.net/qq_42937176/article/details/105575824

访问一个对象的数值:下标系统

x <- 1:10
x[5]

x[5] <- 0
x


y <- matrix(1:10, 2, 5)
y

y[, 5] <- 22:23
y[, 5] # R的缺省规则是返回一个维数尽可能低的对象。

y[-1, ] # display 1st row
y[, -1] # display 1st col
y[, -c(1, 3)] # display 1st and 3rd cols
y[, -c(1:3)] # display from 1st to 3rd cols


z <- 0:9
z[z >=6] <- 9
z
z[z %% 2 == 0]
z[z %/% 2] # ?


s <- 1:20
f <- c(FALSE, TRUE)
s[f]

访问对象的名称(names, colnames, rownames, dimnames):

names是一个和对象有同样长度的向量并且可以通过函数names来访问.
x <- 1:3
names(x)
names(x) <- c('1', '2', '3')
names(x)
x
names(x) <- NULL
x
对于矩阵和数据框,colnames和rownames分别是列和行的标签。它们可以通过各自的函数来访问,或者通过dimnames返回包含两个名称向量的列表。
fx <- matrix(1:4, 2)
rownames(fx) <- c('a', 'b')
colnames(fx) <- c('c', 'd')
fx
dimnames(fx)
对于数组,可以用dimnames来访问各维的名字
A <- array(1:27, dim = c(3, 3, 3))
A
dimnames(A) <- list(c('a', 'b', 'c'), c('d', 'e', 'f'), c('h', 'i', 'j'))
A

数学运算和一些简单的函数https://blog.csdn.net/qq_42937176/article/details/105589953

c(1:5, seq(10, 11, 0.2)) # c() 连接在圆括号内的对象
向量的算术运算
x <- 1:4
y <- rep(1, 4)
z <- x+y
z
x1 <- 1:6
y1 <- 1:3
z1 <- x1 + y1

x2 <- 1:6
y2 <- 1:4
z2 <- x2 + y2

矩阵计算

rbind(); cbind() -> 以上下或左右的方式合并向量或矩阵;
m1 <- matrix(1, nr = 2, nc = 2)
m2 <- matrix(2, nr = 2, nc = 2)
mr <- rbind(m1, m2)
mc <- cbind(m1, m2)
“%*%” -> 两矩阵乘积;
M <- rbind(m1, m2) %*% cbind(m1, m2)
t() -> 转置
a <- matrix(1:6, 2, 3)
t(a)
函数diag可以用来提取或修正一个矩阵的对角元,或者创建一个对角矩阵。
diag(m1)
diag(M)
diag(m1) <- 9
m1

diag(3)

v <- c(10, 20, 30)
diag(v)
diag(2.1, nr = 3, nc = 5)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值