R语言数据处理

个人学习R语言过程中的记录,仅供个人查阅。

R语言学习笔记

安装

注意事项

  • 保证用户名是英文的,如果是中文用户名,建议重装系统并用英文用户名
  • 安装路径不要包含中文,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语言中,可以使用一些技巧和函数来删除异常值。以下是几种常用的方法:

  1. 使用条件筛选:使用逻辑运算符(例如 <, >, <=, >=, ==, !=)结合条件来筛选出不满足特定范围的值。例如,如果你想删除所有大于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)]
  1. 使用离群值检测算法: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)]
  1. 使用缺失值替代:如果你不想完全删除异常值,而是将其替换为缺失值(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)

其他


  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码下载:完整代码,可直接运行 ;运行版本:2022a或2019b或2014a;若运行有问题,可私信博主; **仿真咨询 1 各类智能优化算法改进及应用** 生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化 **2 机器学习和深度学习方面** 卷积神经网络(CNN)、LSTM、支持向量机(SVM)、最小二乘支持向量机(LSSVM)、极限学习机(ELM)、核极限学习机(KELM)、BP、RBF、宽度学习、DBN、RF、RBF、DELM、XGBOOST、TCN实现风电预测、光伏预测、电池寿命预测、辐射源识别、交通流预测、负荷预测、股价预测、PM2.5浓度预测、电池健康状态预测、水体光学参数反演、NLOS信号识别、地铁停车精准预测、变压器故障诊断 **3 图像处理方面** 图像识别、图像分割、图像检测、图像隐藏、图像配准、图像拼接、图像融合、图像增强、图像压缩感知 **4 路径规划方面** 旅行商问题(TSP)、车辆路径问题(VRP、MVRP、CVRP、VRPTW等)、无人机三维路径规划、无人机协同、无人机编队、机器人路径规划、栅格地图路径规划、多式联运运输问题、车辆协同无人机路径规划、天线线性阵列分布优化、车间布局优化 **5 无人机应用方面** 无人机路径规划、无人机控制、无人机编队、无人机协同、无人机任务分配 **6 无线传感器定位及布局方面** 传感器部署优化、通信协议优化、路由优化、目标定位优化、Dv-Hop定位优化、Leach协议优化、WSN覆盖优化、组播优化、RSSI定位优化 **7 信号处理方面** 信号识别、信号加密、信号去噪、信号增强、雷达信号处理、信号水印嵌入提取、肌电信号、脑电信号、信号配时优化 **8 电力系统方面** 微电网优化、无功优化、配电网重构、储能配置 **9 元胞自动机方面** 交通流 人群疏散 病毒扩散 晶体生长 **10 雷达方面** 卡尔曼滤波跟踪、航迹关联、航迹融合
代码下载:完整代码,可直接运行 ;运行版本:2022a或2019b或2014a;若运行有问题,可私信博主; **仿真咨询 1 各类智能优化算法改进及应用** 生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化 **2 机器学习和深度学习方面** 卷积神经网络(CNN)、LSTM、支持向量机(SVM)、最小二乘支持向量机(LSSVM)、极限学习机(ELM)、核极限学习机(KELM)、BP、RBF、宽度学习、DBN、RF、RBF、DELM、XGBOOST、TCN实现风电预测、光伏预测、电池寿命预测、辐射源识别、交通流预测、负荷预测、股价预测、PM2.5浓度预测、电池健康状态预测、水体光学参数反演、NLOS信号识别、地铁停车精准预测、变压器故障诊断 **3 图像处理方面** 图像识别、图像分割、图像检测、图像隐藏、图像配准、图像拼接、图像融合、图像增强、图像压缩感知 **4 路径规划方面** 旅行商问题(TSP)、车辆路径问题(VRP、MVRP、CVRP、VRPTW等)、无人机三维路径规划、无人机协同、无人机编队、机器人路径规划、栅格地图路径规划、多式联运运输问题、车辆协同无人机路径规划、天线线性阵列分布优化、车间布局优化 **5 无人机应用方面** 无人机路径规划、无人机控制、无人机编队、无人机协同、无人机任务分配 **6 无线传感器定位及布局方面** 传感器部署优化、通信协议优化、路由优化、目标定位优化、Dv-Hop定位优化、Leach协议优化、WSN覆盖优化、组播优化、RSSI定位优化 **7 信号处理方面** 信号识别、信号加密、信号去噪、信号增强、雷达信号处理、信号水印嵌入提取、肌电信号、脑电信号、信号配时优化 **8 电力系统方面** 微电网优化、无功优化、配电网重构、储能配置 **9 元胞自动机方面** 交通流 人群疏散 病毒扩散 晶体生长 **10 雷达方面** 卡尔曼滤波跟踪、航迹关联、航迹融合

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值