个人学习R语言过程中的记录,仅供个人查阅。
R语言学习笔记
- 安装
- RSudio的操作
- 怎么同时运行两个RStudio
- 语法
- 算法
- 数据处理
- 回归分析
- 统计分析
- 其它
- 格式转换
- 文本操作
- 变量操作
- 数据框基本操作
- 值得学习的其它博客
- 数据注意事项
- 设置工作目录 setwd()
- 读取数据 read.csv(), read_excel(), read.table(), fread()
- 保存数据 save(), write.csv(),write.table()
- 创建一个数据框 data.frame()
- 创建一个空数据框 data.frame()
- 循环追加空数据框 rbind()
- 拼接两个向量 c()
- 将两个向量的字符分别拼接在一起 mutate()
- 数据框合并 rbind(),cbind(),marge(), transform()
- 排序 sort(), arrange()
- 读取数据框的行列数 dim(), nrow(), crow()
- 读取数据框行列名称rownames(),colnames(), names()
- 预览数据框信息 str(), head(),tail()
- 将数据框的一列设置为因子 as.factor()
- 修改数据框列名 rename(),colnames()
- 修改数据框行名 rownames()
- 数据框按照条件查询并返回下标 which(), subset()
- 数据框增加新的一列 $; cbind(); mutate()
- 根据数据框的旧列科学计算后来添加新列
- 调整某列的位置 select(df, var, everything())
- 计算数据框某列的唯一值 unique(data$B)
- 合并两个数据框 merge()
- 拆分数据框的一列 separate()
- 找列名所在位置 which(names(data)=="season")
- 数据框提取数据
- 数据框删除数据
- 数值运算
- 其他
安装
注意事项
- 保证用户名是英文的,如果是中文用户名,建议重装系统并用英文用户名
- 安装路径不要包含中文,R对中文支持不好
RSudio的操作
怎么同时运行两个RStudio
提前建立两个project,就能同时运行两个RStudio。
注释代码 Ctrl+shift+C
参考链接:http://www.mobange.com/nav/other/85071.html
- 选中要注释掉的行,按 Ctrl+shift+C ,这样就注释掉了。
- 如果要取消注释的话, 依然是先选中,然后按快捷键 Ctrl+shift+C 即可。
- 我们可以通过一个if语句,里面添加一个永为假的条件,这样也可以达到多行注释的目的。
if(FALSE)
{
......
}
RSudio快捷操作
Alt + Shift + K: 查看所有快捷方式
ctrl + shift + F10: 重启
-
代码块
Alt + L: 折叠当前代码块
Shift+ Alt + L: 打开当前代码块
Alt + O: 折叠所有代码块
Shift+ Alt + O: 打开所有代码块
Ctrl+ Shift + O:查看代码块目录
Ctrl+ Shift + R:添加代码块目录 -
代码
F1:查看当前函数的帮助文档
Alt+ Ctrl+ K: 高亮选中的所有函数
Ctrl+ Shift + C: 取消/取消注释当前行
Ctrl+ Shift + M: 管道符号快捷( %>% )
Alt+ -: 赋值符号( <- )
Ctrl+Z: 撤回
Ctrl+ Shift + Z: 取消撤回
Ctrl+ D: 直接刪除所在行
Ctrl+ L: 清空控制台所有命令
Ctrl+ U:可删除当前行鼠标往左的所有内容
ctrl+shfit+h:设置工作目录,setwd()
-
控制台
Ctrl+r: 弹出历史命令
Ctrl+l: 清空命令 -
命令
Esc: 终止目前命令
Ctrl + Enter 运行选中的R代码块、或者执行鼠标光标所在的代码行
Ctrl+ Alt + R: 执行当前脚本所有的代码
Ctrl+ Alt + E: 从当前运行至结尾
Ctrl+Alt+B: 从开始运行至当前行
Ctrl+Alt+E: 从当前行运行至结尾
Ctrl + Shift+S 运行当前脚本文件
Ctrl+ Shift + H: 修改当前工作路径
-函数
Tab:自动补齐
语法
for循环 for(){}
for (i in 1:10){
print(i)
}
条件语句 if( ){ }
- 参考链接:【R语言】条件语句与自定义函数https://zhuanlan.zhihu.com/p/86975887
# 一个分支
if(条件) {
执行体
}
# 两个分支
if(条件) {
执行体1
} else {
执行体2
}
# 多分支例子
if(score >= 90) {
res = "优"
} else if(score >= 80) {
res = "良"
} else if(score >= 70) {
res = "中"
} else if(score >= 60) {
res = "及格"
} else {
res = "不及格"
}
跳出循环 next, break
next:结束本次循环;
break:跳出整个循环。
自定义函数 name <- function( ){ }
R语言中,自定义函数的一般格式为:
函数名 <- function(输入1,……,输入n){
函数体
return(返回值)
}
f <- function(x, y, z=1){
result <- x + y + z
return(result)
}
f(1,2)
管道 |> %>%
-
Rsudio快捷方式:Ctrl+ Shift + M
-
R语言自带管道: |>
-
R包magrittr提供的管道( %>%, %T>%, %$% 和 %<>% )
install.packages("magrittr")
library(magrittr)
# 管道默认将数据传给下一个函数的第一个参数,且它可以省略。
c(1,2,3,4) %>% sin()
# 若传递给下一个函数的使用不是第一参数,必须用“.”代替,绝不能省略。
# 而且,数据可以在下一个函数中使用多次
a <- c(1:20)*pi/10
a %>% plot(x=., y=sin(.))
参考链接:
# R语言实操记录——管道(|>, %>%, %T>%, %$% 和 %<>%)
https://blog.csdn.net/qq_45794091/article/details/127770633
# R语言编程⑦——管道操作
https://zhuanlan.zhihu.com/p/443548010
算法
去除离群值(使用箱线图计算离群值的算法)
# 使用箱线图计算离群值的算法
df <- D_PE_date
D_PE_outlier <- df[0, ] #构建空数据框,用于汇总输出结果
for(i in 1:110){
print(i)
D.i <- subset(df, genotype_num == i)
for(j in parameter_abbr){
D.ij <- D.i[,j]
qnt <- quantile(D.ij, probs = c(.25, .75), na.rm = T, names = FALSE) # 计算分位点
H <- 1.5 * IQR(D.ij, na.rm = T) # 计算四分位范围 # outlier_down <- qnt[1] - H; outlier_up <- qnt[2] + H; qnt; H; outlier_down; outlier_up; outlier <- D.ij[D.ij < (qnt[1] - H) | D.ij > (qnt[2] + H)]
D.i[D.i[,j] < qnt[1] - H | D.i[,j] > qnt[2] + H, j] <- NA
}
D_PE_outlier <- rbind(D_PE_outlier, D.i)
}
Z得分去除异常值
zscore <- phenotype %>%
mutate(z_score = (PSRI_ratio - mean(PSRI_ratio)) / sd(PSRI_ratio)) %>%
filter(abs(z_score) <= 3)
使用函数去除异常值
- R语言系列07——数据清洗3 异常值处理
https://zhuanlan.zhihu.com/p/309891442
链接:https://www.zhihu.com/question/616388480/answer/3159377764
在R语言中,可以使用一些技巧和函数来删除异常值。以下是几种常用的方法:
- 使用条件筛选:使用逻辑运算符(例如
<
,>
,<=
,>=
,==
,!=
)结合条件来筛选出不满足特定范围的值。例如,如果你想删除所有大于3倍标准差的异常值,可以使用如下代码:
# 创建向量data <- c(1, 2, 3, 4, 100, 5, 6, 7)
# 计算均值和标准差mean_val <- mean(data)sd_val <- sd(data)
# 筛选不满足条件的值outliers <- data[data > (mean_val + 3 * sd_val)]
# 剔除异常值clean_data <- data[!(data %in% outliers)]
- 使用离群值检测算法:R语言提供了一些内置函数和包来进行离群值检测,例如
boxplot.stats()
和outlierTest()
。这些函数可以根据统计学原理或机器学习算法来识别异常值,并将其删除。
# 创建向量data <- c(1, 2, 3, 4, 100, 5, 6, 7)
# 使用箱线图方法检测异常值boxplot_data <- boxplot.stats(data)outliers <- boxplot_data$out
# 剔除异常值clean_data <- data[!(data %in% outliers)]
- 使用缺失值替代:如果你不想完全删除异常值,而是将其替换为缺失值(
NA
),可以通过设置一个阈值来实现。例如,可以将超过3倍标准差的值替换为NA
。
# 创建向量data <- c(1, 2, 3, 4, 100, 5, 6, 7)
# 计算均值和标准差mean_val <- mean(data)sd_val <- sd(data)
# 将大于3倍标准差的值替换为NAdata[data > (mean_val + 3 * sd_val)] <- NA
以上仅是一些常用的方法。具体选择哪种方法取决于具体情况和数据分布。在实际应用中,可能需要结合多种方法来删除异常值。
----------------
# 其它
## 并行计算 parallel,foreach
-foreach
【多核的春天】R语言里的并行计算
https://zhuanlan.zhihu.com/p/353329988
```r
library(foreach)
library(doParallel)
# 创建一个集群并注册
detectCores() # core
detectCores(logical = F) # 物理核心
# 设置集群
cl <- makeCluster(18)
registerDoParallel(cl)
# 启动并行计算
system.time(
x2 <- foreach(i = 1:3e4, .combine = c) %dopar% {
mean(rnorm(1e5))}
)
# 在计算结束后别忘记关闭集群
stopImplicitCluster()
stopCluster(cl)
- parallel
R语言的并行运算(CPU多核)
R 多线程跑任务 ----- parallel
https://www.jianshu.com/p/51ef28244db5
版本一、Window版本的R程序
对比普通的LAPPLY函数和Parallel包下的多核makeCluster + parLapply函数效率
library(parallel)
fun <- function(x){
return (x+1);
}
funcTwoPara<-function(x,a){
return (x+a);
}
#单核的普通LAPPLY函数
system.time({
res <- lapply(1:5000000, fun);
});
# 超过一个参数的 Function模型
x=c(1:500)
system.time({
res <- lapply(x,funcTwoPara,a=1);
});
#多核的 MakeCluster 函数,这里利用了本机CPU的2个物理核心同时跑程序
detectCores() # 4 core
detectCores(logical = F) # 2 core 物理核心
cl <- makeCluster(getOption("cl.cores", 4));
system.time({
res <- parLapply(cl, 1:10000000, fun)
});
stopCluster(cl);
计算程序运行时间 system.time(), Sys.time()
# R用Sys.time()可以查看当前系统时间
timestart<-Sys.time() # 程序开始时记录
timeend<-Sys.time() # 程序临结束时记录
runningtime<-timeend-timestart # 程序运行时间
print(runningtime) # 函数中输出运行时间
# system.time()
system.time( for(i in 1:100) mad(runif(1000)) )
获取指定文件夹下所有指定后缀的文件 list.files(path = dir_path, pattern = “\.txt”)
# 设置你的目录路径
dir_path <- "你的目录路径"
# 获取所有txt文件名
txt_files <- list.files(path = dir_path, pattern = "\\.txt")
# 获取完整的文件路径
txt_files_path <- file.path(dir_path, txt_files)
# 打印文件路径
print(txt_files_path)
宽数据变成长数据 gather()
install.packages('tidyr')
library('tidyr') # gather
# From https://stackoverflow.com/questions/1181060
stocks <- tibble(
time = as.Date("2009-01-01") + 0:9,
X = rnorm(10, 0, 1),
Y = rnorm(10, 0, 2),
Z = rnorm(10, 0, 4)
)
gather(stocks, "stock", "price", -time)
stocks %>% gather("stock", "price", -time)
# get first observation for each Species in iris data -- base R
mini_iris <- iris[c(1, 51, 101), ]
# gather Sepal.Length, Sepal.Width, Petal.Length, Petal.Width
gather(mini_iris, key = "flower_att", value = "measurement",
Sepal.Length, Sepal.Width, Petal.Length, Petal.Width)
# same result but less verbose
gather(mini_iris, key = "flower_att", value = "measurement", -Species)
R语循环结果赋值给多个变量 assign( name[i], i )
# 错误写法
for(i in 1:10){ Ai <- i }
# 正确写法
for(i in 1:10){ assign(paste0('A','_',i,sep=""),i) }
name <- c("aa","bb","cc","dd","ee")
for(i in 1:5){ assign(name[i],i) }
参考链接:
R语循环结果赋值给多个变量
https://zhuanlan.zhihu.com/p/482573481
数据处理
回归分析
## Annette Dobson (1990) "An Introduction to Generalized Linear Models".
## Page 9: Plant Weight Data.
ctl <- c(4.17,5.58,5.18,6.11,4.50,4.61,5.17,4.53,5.33,5.14)
trt <- c(4.81,4.17,4.41,3.59,5.87,3.83,6.03,4.89,4.32,4.69)
group <- gl(2, 10, 20, labels = c("Ctl","Trt"))
weight <- c(ctl, trt)
lm.D9 <- lm(weight ~ group)
lm.D90 <- lm(weight ~ group - 1) # omitting intercept
anova(lm.D9)
summary(lm.D90)
opar <- par(mfrow = c(2,2), oma = c(0, 0, 1.1, 0))
plot(lm.D9, las = 1) # Residuals, Fitted, ...
par(opar)
### less simple examples in "See Also" above
统计分析
计算R2和P
y <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
x <- c(1.5, 1.9, 3.2, 4.6, 5.3, 5, 6.6, 7.9, 9.2, 11)
df <- data.frame(y=y, x=x)
plot(df$y,df$x)
# 使用 lm() 线性拟合
model <- lm(df$y~df$x)
# 使用 summary() 计算R2
summ <- summary(model)
R2 <- summ$r.squared
cat('R2:',R2,'\n')
# 使用 summary() 计算P
P1 <- summ$coefficients[2,4]
cat('P1:',P1,'\n')
# 使用 rsq() 计算R2
# library(cc)
R2 <- rsq(model)
cat('R2:',R2,'\n')
# 使用cor.test() 计算P
cortest <- cor.test(df$x,df$y)
P2 <- cortest$p.value
cat('P2:',P2,'\n')
# 使用 cor() 计算R
R <- cor(df$x,df$y)
cat('R:',R,'\n')
参考链接:
R语言:一元线性回归分析
https://zhuanlan.zhihu.com/p/114509869?from_voters_page=true
Q-Q图
https://zhuanlan.zhihu.com/p/53124278
其它
格式转换
转字符 as.character()
字符串转数值 as.numeric()
# 定义一个字符串
string_number <- "123.45"
# 使用as.numeric将字符串转换为数值
numeric_value <- as.numeric(string_number)
# 输出结果
numeric_value
变量名转字符串 substitute()
在R语言中将变量名转化为同名字符串的函数
var <-c(1, 2, 3)
str <- substitute(var)
print(var) # 1 2 3
print(str) # var
参考链接:
R语言将变量名转化为同名字符串-屏幕输出函数
https://www.douban.com/note/618269712/?_i=329261279XptiB
字符串转变量名 get()
a <- 1
str <- "a"
print(a) # 1
print(str) # "a"
print(get(str)) # 1
循环给字符串赋值 assign(name[1], 100)
for(i in 1:10){
assign(paste0('A',i),i)
}
name <- c("aa","bb","cc","dd","ee")
for(i in 1:5){
assign(name[i],i)
}
# 如果变量是列表,也可以采用如下方式
names <- paste0("GWAS",1:5)
GWAS_list <- list()
for(i in 1:5){
GWAS_list[[ names[i] ]] <- GWAS[GWAS$Trait.ID==i, c("chr","start","end")]
}
参考链接:
R语循环结果赋值给多个变量 https://zhuanlan.zhihu.com/p/482573481
list转向量 unlist()
转换为日期格式date数据 as.Date, as.POSIXct
- 数据框有一列是数据表示日期,read.csv读进去之后是chr格式,使用函数 as.Date() 转换成日期格式。注意D是大写,经常写错。
df$time <- as.Date(df$time) # 将df数据框中的 time 列转换成date格式
- as.POSIXct
将矩阵转换成数据框 as.data.frame()
转矩阵 as.matrix()
多列变成一列mutate() + melt()
library(reshape2) # 提供函数 melt()
library(dplyer) # 提供函数 ename()
cormtcars <- round(cor(mtcars), 3) # 计算保留三位小数的相关性矩阵
data <- as.data.frame(cormtcars) %>% # 将矩阵转换成数据框
mutate(x=rownames(cormtcars)) %>% # 新建一列x,是11个变量名
melt(id='x') %>% # 将宽数据转换成长数数据
dplyer::rename('y'='variable','Corr'='value') # 将variable列名改成y
文本操作
拆分字符串 strsplit()
# 原始字符
original_string <- "1:2:3"
# 使用strsplit函数拆分字符
split_result <- strsplit(original_string, ":")
# 提取拆分后的结果
result <- unlist(split_result)
# 输出结果
result
截取字符串 substr()
year <- substr(id_number$身份证号,7,10)
串联字符串 paste(), paste0()
替换字符 gsub()
gsub(“上”,“下”,“上班真好”)
输出字符串插入变量 glue()
install.packages('glue')
library(glue)
num = 1
glue("数字是{num}")
数字前面使用0填充
# 创建一个示例数据框
df <- data.frame(
column = c(1, 2, 3, 1, 4, 1, 5)
)
# 将数据框中的数字1转换为字符串"01"
df$column <- formatC(df$column, width = 2, format = "d", flag = "0")
print(df)
拼接路径 file.path()
调整数字的位数 sprintf(), formatC(), format()
sprintf("%03.f",1) # 001
# width 设置字段的宽度
formatC(1, width = 3) # " 1", 默认右对齐, 前面用空格补齐
formatC(1, width = 3) # " 1", 默认右对齐, 前面用空格补齐
formatC(1, width = 3, flag = "-") # "1 ", flag = "-"设置左对齐, 后面用空格补齐
formatC(1, width = 3, flag = "0") # "001", flag = "0"设置前面用0补齐
# digits 设置小数点后位数(format = "f"), 或者有效数字位数(默认), 默认整数为2,实数为4
formatC(1.3456, digits = 3, format = "f") # 保留小数点后3位, "1.346"
formatC(c(6.0, 13.1), digits = 2,format = "fg" ) # 保留两位有效数字, 输出结果:" 6" "13"
# 科学计数
# 数值左对齐
format(rbind(1,123))
format(rbind(1,123), trim = TRUE) # trim = TRUE 表示取消默认的右对齐, 删除对齐前面的空格,看起来像是没有空格的左对齐
# 文字左对齐
format(data.frame("names"= c("aaaaa", "b"), justify = "left")
# nsmall参数 设置小数点位数
format(13.7, nsmall = 3) # "13.700"
# digits参数, 设置有效数字位数
format(c(6.0, 13.1234), digits = 4) # " 6.0" "13.1"
# 科学计数法
format(2^31-1) # 显示全部
format(2^31-1, scientific = TRUE) # 科学计数法
format(2^31-1, scientific = TRUE, digits = 3) # 控制有效位数
调整小数点的位数 round()
newdf <- round(cor(df), 2)
大小写转换 tolower(), toupper(),
大写函数 toupper()函数
小写函数tolower()函数
首字母大写要调用Hmisc包的capitalize()函数
或用stringr包里的str_to_title()函数
变量操作
移除变量 rm()
保存数据 save(), write.csv()
save(var, file = "c:/var.Rdata")
write.csv(var, file = "c:/var.csv")
数据框基本操作
值得学习的其它博客
- R语言数据结构之数据框
https://blog.csdn.net/m0_54356409/article/details/124201952
数据注意事项
- 列名不能有空格
设置工作目录 setwd()
读取数据 read.csv(), read_excel(), read.table(), fread()
-
读取csv格式数据 read.csv()
-
读取xlsx格式数据 read_excel()
-
读取txt格式 read.table(),read.table()读取大文件(主要是基因数据)不加quote=""不能完整读取。
[R] read.table/read.delim读入数据行数变少?
https://www.cnblogs.com/miyuanbiotech/p/11445943.html -
读取大文件,推荐使用fread(), fread和 read.table一样,但是读取大文件(尤其基因数据)会更快,而且读取更完整。
# 读取csv格式数据 read.csv()
data <- read_csv("E:\\data.csv")
# 读取xlsx格式数据 read_excel()
install.packages('readxl')
library(readxl)
data <- read_excel("E:\\data.xlsx")
# 读取txt格式 read.table()
data <- read.table("E:\\data.txt", header = TRUE, sep = "\t") # fill = TRUE
line1 <- readLines("E:\\data.txt", n = 1) 加载 .txt文件
保存数据 save(), write.csv(),write.table()
save(var, file = "c:/var.Rdata")
write.csv(var, file = "c:/var.csv")
write.table(test, "test.txt", quote = F, sep = "\t", row.names = F, col.names = F,eol = "\t")
创建一个数据框 data.frame()
table = data.frame(
姓名 = c("张三", "李四"),
工号 = c("001","002"),
月薪 = c(1000, 2000),
row.names = c(1:2) )
print(table) # 打印数据框
str(table) # 数据结构
print( summary(table) ) # 打印概要,一些统计信息
print( data.frame(table$姓名, table$月薪) ) # 提取指定行列
print( data[1:2,])
table$部门 <- c("运营","技术","编辑") # 添加列
cbind(table, table) # 合并列,行
rbind(table, table)
创建一个空数据框 data.frame()
# 直接创建
df_empty <- data.frame()
colnames(df.empty) <- c('var1', 'var2', 'var3')
# 通过已有的数据框创建,使用旧数据框的列名,可能不太对,看着别扭,但是能用
df_empty <- df[1,][-1,]
# 或者下面这种,填充再删除
df.empty <- data.frame(var1="",var2="",var3="")[-1,]
# 空矩阵转数据框
df.empty <- data.frame(matrix(ncol = 3, nrow = 0))
colnames(df.empty) <- c('var1', 'var2', 'var3')
循环追加空数据框 rbind()
df_num <- data.frame()
for (i in 1:110){
df_num <- rbind(df_num, i, i)
}
print(df_num)
path_save <- 'D:/'
write.csv(df_num, file = paste0(path_save, "genotype_num.csv") )
拼接两个向量 c()
- 构建向量是c(), 拼接两个向量也是c()
A <- c(1:3)
B <- c(5:10)
C <- c(A, B)
将两个向量的字符分别拼接在一起 mutate()
# 将数据框中df的name和age分别拼接在一起,作为一个新变量
library(dplyr)
library(stringr)
newdf <- mutate(df, newvar = str_c(name, age, sep = '_'))
# 网上的例子(https://bbs.pinggu.org/forum.php?mod=viewthread&tid=6676000&page=1#pid53793584)
require('tidyverse')
A <- c("S1","S2","S3")
B <- c("AFG","ALB","DZA")
data_frame(A, B) %>%
expand(A, B) %>%
mutate(var = str_c(B, A, sep = '.')) %>%
pull(var)
数据框合并 rbind(),cbind(),marge(), transform()
参考链接
字段合并_1.3 R语言数据合并与追加
https://blog.csdn.net/weixin_39596720/article/details/112696799
- 纵向合并
合并的前提是两个数据的列数以及表头名称完全一致
rbind(df1, df2) - 横向合并
1、无需匹配字段
合并的前提是两个数据框行数相同
cbind(df1, df2)
2、匹配字段合并
## 两个数据框列名(主字段X)完全一致,具有相同列名时by=“X”可省略.
merge(df1,df2,by= “X”)
## 主字段不同名,取交集,两个数据某一主字段的部分行名称相同,将两个数据合并,保留行名相同的部分
merge(df1,df2,by.x="X",by.y= "Y")
## 在取交集的前提下保留前半部分特有数据
merge(df1,df2,by.x="X",,by.y="Y",all.x=TRUE)
## 只是在取交集的前提下保留后半部分特有数据
merge(df1,df2, by.x="X",by.y="Y", all.y=TRUE)
# 该链接方法保留两个数据的并集
merge(df1, df2, by.x="X",by.y="Y", all=TRUE)
- 新增字段合并(追加) transform
df2 <- transform(df1, v4 = (v1+v2)/v3)
排序 sort(), arrange()
-
给向量排序 sort()
sort(x, decreasing = FALSE, …)
默认是降序 -
给数据框排序 arrange()
使用dplyr包的 arrange() 函数
library(dplyr)
arrange(data,ver1) # 依据ver1升序对data进行排序
arrange(data,ver1,ver2) # 依据ver1升序和ver2升序对data进行排序(针对ver1升序后重复的数据,依据ver2升序进行排序)
arrange(data, desc(ver1), ver2) #以及ver1降序,ver2升序对data排序
- 针对字符格式(chr)向量排序
使用 stringr 包的 str_sort() 函数
读取数据框的行列数 dim(), nrow(), crow()
dim(df) # 维度
dim(df)[1] # 行数
dim(df)[2] # 列数
nrow(df) # 行数
ncol(df) # 列数
读取数据框行列名称rownames(),colnames(), names()
预览数据框信息 str(), head(),tail()
str(df) # 打印数据框结构信息
head(df,5) # 打印数据框前五行数据
tail(df,5) # 打印数据框后五行数据
将数据框的一列设置为因子 as.factor()
df$gender <- as.factor(df$gender)
str(df$gender) # 查看
df G e n d e r < − a s . f a c t o r ( d f 1 Gender <- as.factor(df1 Gender<−as.factor(df1Gender)
修改数据框列名 rename(),colnames()
- 使用函数 rename()
newdata <- rename(data, "newname" = oldname)
- 使用函数 names()
names(data)[1] <- "newname1"
names(data)[1:2] <- c("newname1","newname2")
- 使用函数 colnames()
colnames(data)[1] <- "newname1" # 只修改固定列的列名
colnames(data)[1:2] <- c("newname1","newname2")
colnames(data) <- c("newname1","newname2","newname3") # 默认只有三列
修改数据框行名 rownames()
使用函数 ronames()
rownames(data)[1:3] = letters[1:3]
数据框按照条件查询并返回下标 which(), subset()
which(df$age == 27) # 返回符合条件行的下标
which(df$age == 27, 'age') # 返回符合符合条件的数值
which(df$age == 27 & df$height > 170, 'name')
which(df$age == 27 | df$height > 170, 'name')
which.min(df$age)
which.max(df$age)
subset(df, age == 27 & height > 170, c('Name', 'Age'))
数据框增加新的一列 $; cbind(); mutate()
# 注意下面方法要长度相同
df$age <- c(15,21,23,24,25)
df<- cbind(df, age = c(15,21,23,24,25))
df <- mutate(df, age = 0) # 添加一列0值,名称为'age',默认在最后一列
根据数据框的旧列科学计算后来添加新列
# 示例数据框
data <- data.frame(original_column = c(1, 2, 3, 4, 5))
# 将原始列的值乘以2并存储在新列中
data$new_column <- data$original_column * 2
# 将原始列的值取对数并存储在新列中
data$new_column <- log(data$original_column)
# 查看包含新列的数据框
print(data)
调整某列的位置 select(df, var, everything())
df <- select(df, age, everything()) # 将age列调整在第一列
# 也可使用下面
计算数据框某列的唯一值 unique(data$B)
# 创建一个示例数据框
data <- data.frame(
A = c(1, 2, 2, 3, 3),
B = c("apple", "banana", "banana", "orange", "orange")
)
# 获取数据框某列的唯一值
unique_column_values <- unique(data$B)
# 显示唯一值
unique_column_values
合并两个数据框 merge()
# 假设 df1 和 df2 是要合并的两个数据框,key 是它们共同的列
merged_df <- merge(df1, df2, by = "key", all = TRUE) # "key" 是共同的列名,all = TRUE 表示使用外连接合并
# 假设 df1、df2 和 df3 是要合并的三个数据框,key 是它们共同的列
merged_df <- merge(merge(df1, df2, by = "key", all = TRUE), df3, by = "key", all = TRUE)
# 安装和加载 dplyr 包
# install.packages("dplyr")
# library(dplyr)
# 使用 left_join、right_join、inner_join 或 full_join 来选择合并方式
merged_df <- full_join(df1, df2, by = "key") # 使用 full join 合并
拆分数据框的一列 separate()
install.packages('tidyr')
library(tidyr)
df <- tibble(x = c(NA, "x.y", "x.z", "y.z"))
df %>% separate(x, c("A", "B"))
找列名所在位置 which(names(data)==“season”)
which(names(data)=="season")
数据框提取数据
通过位置提取数据 data[ ,1] ; data[[1]]
data_col <- data[ ,1] # 提取第1列
data_row <- data[1, ] # 提取第1列
data_col <- data[ ,1:3] # 提取第1列到第3列
data_col <- data[ ,c(1,3)] # 提取第1列和第3列
通过列名提取数据 data[“var”] ; data[[“var”]]
data_var <- data[“var”] # 提取列名为var的向量
通过符号提取数据 data$var
data_var <- data$var # 提取列名为var的向量
通过数值范围提取数据 data[data$var > 10, ]
data_var <- data[data$var > 10, ] # 提取列向量var数值
# 此外多条件筛选条件可以使用符号与“&”(同时满足两种条件),或“|”(满足任一条件),等于“==”
data_var <- data[data$var1 > 10 & data$var2 < 20, ] # 提取同时满足两个条件的行数据
data_var <- data[data$var1 > 10 | data$var2 < 20, ] # 提取同时任一条件的行数据
data_var <- data[data$var1 == 1, ] #等号的使用
通过函数提取数据 subset() ,select()
- 使用 subset() 函数按照一定的条件提取数据
subset(airquality, Temp > 80, select = c(Ozone, Temp))
subset(airquality, Day == 1, select = -Temp)
subset(airquality, select = Ozone:Wind)
with(airquality, subset(Ozone, Temp > 80))
- 使用select() 函数提取列数据
library(dplyr)
select(df,1)
select(df,var)
select(df,var1:var3)
同时提取多个字段 df[, c(“field1”, “field2”)]
selected_cols <- df[, c("field1", "field2")]
# 使用 subset 函数选择要获取的字段
selected_cols <- subset(df, select = c("field1", "field2"))
# 使用 select 函数选择要获取的字段
# 安装和加载 dplyr 包
# install.packages("dplyr")
# library(dplyr)
selected_cols <- select(df, field1, field2)
使用逻辑向量来提取指定条件数据
# 创建一个示例数据框
df <- data.frame(name = c("Alice", "Bob", "Charlie", "Alice", "David"),
age = c(25, 30, 35, 25, 40))
# 指定要筛选的名字集合
target_names <- c("Alice", "David")
# 使用逻辑向量来指定条件
condition <- df$name %in% target_names
# condition <- !(df$name %in% target_names)
# 根据条件筛选数据
filtered_df <- df[condition, ]
# 打印筛选后的数据框
print(filtered_df)
数据框删除数据
删除数据框的某一列或者行 data[-1, ], select(data, -1),subset(), slice(), filter()
- 使用符号“-”和数字删除数据框行列
# 使用行列号删除行列
newdata <- data[-1, ] # 删除第一行
newdata <- data[ ,-1] # 删除第一列
newdata <- data[-c(1,2), ] # 删除1,2行
newdata <- data[, -c(1,2)] # 删除1,2列
- 使用 select() 函数删除列
df1 <- select(df,-3) # 删除第3列
df2<- select(df,-name) # 删除列名为name的列
df3<- select(df,-c(name,age)) #删除列名为name和age的列
- 包的函数 slice() 删除行
library(dplyr)
newdata <- slice(data, -c(1,2)) # 删除1,2行
- 使用函数 subset() 删除行
newdata <- subset(data, name != "wang") # 删除name等于wang的行
- 使用 函数 filter() 删除行
newdata <- filter(data, name != "wang") # 删除name等于wang的行
newdata <- filter(data, name != "wang" $ age != 25) #删除name等于wang的行并且age等于25的行
- 先根据条件使用 which() 获取行号,再根据行号使用符号“-”删除行
实际操作的时候遇到需要删除符合很多条件的行,可以分别获取各种条件的行号,然后把行号拼接在在一起
# 由于删除条件存在冲突,不能使用&符号一起处理,所以分别提取行号,再合并行号,根据行号删除行
rownum1 <- which(CO2$uptake < 10 & CO2$uptake > 5)
rownum2 <- which(CO2$uptake > 30)
rownum <- c(rownum1, rownum2)
newdata <- CO2[-rownum, ]
- 使用 “!”删除符合一定条件的行
# 删除数据框中var向量有空值的行
newdata <- data[!is.na(data[ ,"var"]), ]
# 删除数据框中var向量小于10的行
newdata <- data[!data[data$var < 10, ], ]
删除缺失值NA na.omit(); is.na()
-
- 删除数据框所有NA值所在的行
newdata <- na.omit(data)
- 删除指定列的NA值所在的行
首先使用 is.na()函数找NA所在行
使用 !is.na(), 反转选择非NA行
data[! is.na(data[,1]),]
删除重复的行 duplicated(), unique()
- unique() 函数 直接返回去除重复后的向量
var_new <- unique(var)
- duplicated() 函数返回逻辑值,根据逻辑值删除向量中重复的数值
var_new <- var[!duplicated(var), ]
数值运算
取均值 mean
- mean,一般使用函数 mean()
根据条件分组求均值 aggregate(), summarise()
- aggregate, 根据某一列的分组取均值。aggregate 帮助文档如下。
## example with character variables and NAs
testDF <- data.frame(v1 = c(1,3,5,7,8,3,5,NA,4,5,7,9),
v2 = c(11,33,55,77,88,33,55,NA,44,55,77,99) )
by1 <- c("red", "blue", 1, 2, NA, "big", 1, 2, "red", 1, NA, 12)
by2 <- c("wet", "dry", 99, 95, NA, "damp", 95, 99, "red", 99, NA, NA)
aggregate(x = testDF, by = list(by1, by2), FUN = "mean")
## Formulas, one ~ one, one ~ many, many ~ one, and many ~ many:
## ~符号左边是需要被平均的向量,右边是条件。
aggregate(weight ~ feed, data = chickwts, mean) # one ~ one
aggregate(breaks ~ wool + tension, data = warpbreaks, mean) # one ~ many
aggregate(cbind(Ozone, Temp) ~ Month, data = airquality, mean) # many ~ one
aggregate(cbind(ncases, ncontrols) ~ alcgp + tobgp, data = esoph, sum) # many ~ many
summarise 用于分组汇总
# 根据分组,求均值、标准差、标准误、个数
library(dplyr)
A <- group_by(date,class1,class2)
B <- summarise(A, mean = mean(var1), sd = sd(var1), se =sd(seed_setting_rate)/sqrt(n()), n = n())
- 网友定义的函数 summarySE(),能根据分组求去除空值的均值、标准差、标准误、个数等
参考链接:https://www.zhangshengrong.com/p/ArXGbnrENj/
(R语言绘制带误差线的条形图)
summarySE <- function(data=NULL, measurevar, groupvars=NULL, na.rm=FALSE,
conf.interval=.95, .drop=TRUE) {
library(plyr)
# New version of length which can handle NA's: if na.rm==T, don't count them
length2 <- function (x, na.rm=FALSE) {
if (na.rm) sum(!is.na(x))
else length(x)
}
# This does the summary. For each group's data frame, return a vector with
# N, mean, and sd
datac <- ddply(data, groupvars, .drop=.drop,
.fun = function(xx, col) {
c(N = length2(xx[[col]], na.rm=na.rm),
mean = mean (xx[[col]], na.rm=na.rm),
sd = sd (xx[[col]], na.rm=na.rm)
)
},
measurevar
)
# Rename the "mean" column
datac <- rename(datac, c("mean" = measurevar))
datac$se <- datac$sd / sqrt(datac$N) # Calculate standard error of the mean
# Confidence interval multiplier for standard error
# Calculate t-statistic for confidence interval:
# e.g., if conf.interval is .95, use .975 (above/below), and use df=N-1
ciMult <- qt(conf.interval/2 + .5, datac$N-1)
datac$ci <- datac$se * ciMult
return(datac)
}
向量归一化
使用creditmodel包的min_max_norm()函数
install.packages(creditmodel)
library(creditmodel)
min_max_norm(x)