R语言列表与数据框

最后发布时间:2020-06-01 17:05:16 浏览量:

R语言进行数据分析,大部分是将数据转化为数据框。数据框形式上是列表,本质上是矩阵。

列表的创建

zhuan_ye <- c('植物学','动物学','基因工程','发酵工程')
xue_sheng <- c(全日制=30000, 非全日制=20000) # 带名称的数值向量

xue_yuan <- list(zhuan_ye=zhuan_ye,xue_sheng=xue_sheng)
xue_yuan
# $zhuan_ye
# [1] "植物学"   "动物学"   "基因工程" "发酵工程"
# 
# $xue_sheng
# 全日制 非全日制 
# 30000    20000 
length(xue_yuan) # [1] 2
names(xue_yuan) # [1] "zhuan_ye"  "xue_sheng"
typeof(xue_yuan) # [1] "list"

列表的子集

xue_yuan$xue_sheng
# 全日制 非全日制 
# 30000    20000
xue_yuan$xue_sheng['全日制']
# 全日制 
# 30000 
sum(xue_yuan$xue_sheng) # [1] 50000

# 通过[] 访问
xue_yuan[2] # 单个的[], 看到的依然是包装箱
# $xue_sheng
#全日制 非全日制 
# 30000    20000 
typeof(xue_yuan[2]) # [1] "list"
typeof(xue_yuan[[2]]) # [1] "double"
typeof(xue_sheng) # [1] "double"

sum(xue_yuan[[2]]) # [1] 50000
xue_yuan["xue_sheng"]
# $xue_sheng
# 全日制 非全日制 
# 30000    20000 
xue_yuan[['xue_sheng']]
# 全日制 非全日制 
# 30000    20000

列表的修改

xue_yuan$gender <- c(Male=30000,Female=20000)
length(xue_yuan) # [1] 3
names(xue_yuan) # [1] "zhuan_ye"  "xue_sheng" "gender"   
xue_yuan$gender <- NULL # 删除
names(xue_yuan) # [1] "zhuan_ye"  "xue_sheng"

unlist(lapply(xue_yuan, length)) 
sapply(xue_yuan, length)
# zhuan_ye xue_sheng 
# 4         2 
sapply(xue_yuan, typeof)
# zhuan_ye   xue_sheng 
# "character"    "double" 

数据框的创建

xm <- c('张三','李四','王五','刘备')
xb <- factor(c('女','男','男','男'))
yw <- c(97,98,96,85)
sx <- c(96,85,93,91)

cjb <- data.frame(xm=xm,xb=xb,yw=yw,sx=sx)
cjb
# xm xb yw sx
# 1 张三 女 97 96
# 2 李四 男 98 85
# 3 王五 男 96 93
# 4 刘备 男 85 91

数据框的操作

# 子集访问
cjb$yw
cjb[["yw"]]
cjb[[3]]
# [1] 97 98 96 85

cjb[1,] # 访问第一行
# xm xb yw sx
# 1 张三 女 97 96
cjb[c(1,3),c("yw","xm")]
# yw   xm
# 1 97 张三
# 3 96 王五
cjb[1:3,-1]
# xb yw sx
# 1 女 97 96
# 2 男 98 85
# 3 男 96 93

cjb <-cbind(cjb,ls=c(98,98,95,96))
cjb
# xm xb yw sx ls
# 1 张三 女 97 96 98
# 2 李四 男 98 85 98
# 3 王五 男 96 93 95
# 4 刘备 男 85 91 96

测试数据

cjb <- read.csv("/home/wy/Downloads/cjb.csv",
                header = TRUE,
                stringsAsFactors = FALSE,
                fileEncoding = "UTF-8")
View(cjb)
head(cjb)
tail(cjb,n=3)
str(cjb) # structure
# 'data.frame':	775 obs. of  13 variables:
#   $ xm  : chr  "周黎" "汤海明" "舒江辉" "翁柯" ...
# $ bj  : int  1101 1101 1101 1101 1101 1101 1101 1101 1101 1101 ...
# $ xb  : chr  "女" "男" "男" "女" ...
# $ yw  : int  94 87 92 91 85 92 88 81 88 94 ...
# $ sx  : int  82 94 79 84 92 82 72 89 77 81 ...
# $ wy  : int  96 89 86 96 82 85 86 87 95 88 ...
# $ zz  : int  97 95 98 93 93 91 94 97 94 91 ...
# $ ls  : int  97 94 95 97 87 90 87 94 84 85 ...
# $ dl  : int  98 94 96 94 88 92 88 96 94 98 ...
# $ wl  : int  95 90 89 82 95 82 89 81 87 81 ...
# $ hx  : int  94 90 94 90 94 98 98 88 94 88 ...
# $ sw  : int  88 89 87 83 93 90 94 83 82 88 ...
# $ wlfk: chr  "文科" "文科" "文科" "文科" ...

summary(cjb)

names(cjb)
# [1] "xm"   "bj"   "xb"   "yw"   "sx"   "wy"   "zz"   "ls"   "dl"  
# [10] "wl"   "hx"   "sw"   "wlfk"

colnames(cjb) # 同上
nrow(cjb) # [1] 775
ncol(cjb) # [1] 13
length(cjb) # [1] 13
cjb$bj <- factor(cjb$bj) # 转换为因子
cjb$xb <- factor(cjb$xb)
summary(cjb) # 查看是否为因子

cjb$zcj <- apply(cjb[,4:12],1,sum) # 新增加一列总成绩 1表示按行进行操作


order_zcj <- order(cjb$zcj,decreasing = TRUE)[1:5]
cjb[order_zcj,] # 按照总成绩从高到低排序

划分训练集和测试集

set.seed(2012)
n_record <- nrow(cjb) # [1] 775
# 从1-775取70%训练集的下标
train_idx <- sample(1:n_record,floor(n_record*0.7))
train_idx <- sample(n_record,n_record*0.7) # 两个集合的 在A里不在B里
length(train_idx)# [1] 542

test_idx <- (1:n_record)[-train_idx] # 获取测试集下标
test_idx <- setdiff(1:n_record,train_idx)
length(test_idx) # [1] 233
cjb[train_idx,]
cjb[-train_idx,]
cjb[test_idx,]

注意:训练集和测试集不应该有交集