当前位置: 首页 > news >正文

R语言处理表格数据(一)

目录

    • 写在前面
    • 1. Excel有上百列数据,把每列数据首尾相接合并成一个向量(一列)
    • 2. 合并多个数据表(.csv)
    • 3. 实现2个Excel表相同数据的关联,并提取相同数据到新表
    • 4. 获取Excel表里面列名为TEM的所有数据并保存
    • 5. 将文件夹中的.dbf文件转换为.xlsx文件
    • 6. excel表格中生成重复数据
    • 7. 表格数据按列合并!!!

写在前面

  这是我新开的一个专题,专门用来记录我在处理数据的过程中遇到的一些问题,并且记录下我使用R语言处理表格数据(主要是.xlsx和.csv数据)的过程(包括一些“坑”),之后还会继续更新。如果能帮到你,顺便给博主点个赞吧!
在这里插入图片描述

1. Excel有上百列数据,把每列数据首尾相接合并成一个向量(一列)

需要处理的文件:
在这里插入图片描述

#---------------------------------------------------------------------
## @ author:JAckson Zhao
#  @ time:2023/3/16 20:31:48
# @ description:Excel有上百列数据,把每列数据首尾相接合并成一个向量(一列)
setwd("D:/R语言")
library(readxl)
df <- read_excel("D:/R语言/1.xlsx")
df

# 将两列数据首尾相连合并为一列
merged_col <- paste(data$a, data$b, sep = "")

##法1:
# 将列a和列b首尾相接合并成一个向量
new_col <- c(df$a, df$b)
# 将新的向量转换为一个新的数据框
new_df <- data.frame(new_col)
new_df

##法2:
# 在 R 语言中,unlist() 函数用于将一个嵌套的列表或向量转换为一个单层的向量。
# 如果一个列表或向量是多层嵌套的,它的元素可以是列表或向量,则 unlist() 函数可以将所有元素拉平为一个单层的向量。
# 这个函数在处理数据集时非常有用,因为许多函数需要输入一个单层的向量,而不是嵌套的列表或向量
vector <- unlist(df)
new_df1 <- data.frame(vector)
new_df1

write.table(new_df,"dataframe.xlsx", sep = "\t", quote = FALSE, row.names = FALSE)
write.table(new_df,"vector.xlsx", sep = "\t", quote = FALSE, row.names = FALSE)

结果展示:
1、dataframe.xlsx:
在这里插入图片描述
2、vector.xlsx:
在这里插入图片描述

2. 合并多个数据表(.csv)

数据列表:
在这里插入图片描述

在这里插入图片描述

setwd("D:/R语言/practice")
# 设置文件夹路径
folder_path <- "D:/R语言/practice"

# 获取所有.csv文件的路径
file_paths <- list.files(folder_path, pattern = "\\.csv$", full.names = TRUE)
file_paths <- file_paths[order(as.numeric(gsub("\\D", "", file_paths)))]
file_paths

# 提取文件名中的数字,并用作列名
colnames <- gsub("\\D", "", basename(file_paths))
colnames <- paste("file", colnames, sep = "")
colnames

# 读取并整理数据
data_list <- lapply(file_paths, function(file_path) {
  data <- read.csv(file_path, header = FALSE, stringsAsFactors = FALSE)
  names(data) <- c("rowname", basename(file_path))
  data.frame(rowname = data$rowname, data[[2]], stringsAsFactors = FALSE)
})
data_list

# 合并数据
merged_data <- Reduce(function(x, y) merge(x, y, by = "rowname", all = TRUE), data_list)

# 修改列名
names(merged_data)[-1] <- colnames

# 将合并的数据写入新的.csv文件
write.csv(merged_data, file = "merge.csv", row.names = FALSE)

输出结果:
在这里插入图片描述

在这里插入图片描述

结果展示:

在这里插入图片描述
在这里插入图片描述

3. 实现2个Excel表相同数据的关联,并提取相同数据到新表

##----------------------------------------------------------------------------------
# @author:Jackson Zhao
# @time:2023/3/18 11:15:08
# 数据匹配:实现2个Excel表相同数据的关联,并提取相同数据到新表
library(dplyr)
library(readxl)

setwd("D:/lucc/anusplin2018")
a <- read_excel("yanjiuqu_qixiangzhan2018albers.xlsx")
b <- read_excel("0102.xlsx")
dim(a)
dim(b)

new_df <- inner_join(a, b, by = "区站号", multiple = "all")
dim(new_df)

new_df$平均气温 <- new_df$平均气温 * 0.1
head(new_df$平均气温)
new_df$`20-20时累计降水量` <- new_df$`20-20时累计降水量` *0.1
head(new_df$`20-20时累计降水量`)
head(new_df)

write.table(new_df,"0102new2.xlsx", sep = "\t", quote = FALSE, row.names = FALSE)

# 计算不重复数据的个数
unique_count <- n_distinct(unique(new_df[,1]))
unique_count

#c<- unique(new_df[,1]) # 218个不重复数据,with 208 more rows

4. 获取Excel表里面列名为TEM的所有数据并保存

##-------------------------------------------------------------------------------------
# @author:Jackson Zhao
# @time:2023/3/18 14:32:39
# 获取Excel表里面列名为TEM的所有数据并保存
library(readxl)

# 读取原始数据表
data <- read_excel("TEM_PRE.xlsx")
head(data)
dim(data)

# 匹配包含"TEM"的列名
tem_cols <- grep("PRE", names(data), value = TRUE)

# 选择包含"TEM"的列
new_data <- data[, tem_cols]
new_data

# 保存到新Excel表格中
write.table(new_data,"0102PRE.xlsx", sep = "\t", 
            quote = FALSE, row.names = FALSE)

5. 将文件夹中的.dbf文件转换为.xlsx文件

##-------------------------------------------------------------------------------------
# @author:Jackson Zhao
# @time:2023/3/24 17:42:12
# 将文件夹中的.dbf文件转换为.xlsx文件
# 导入需要使用的包
library(foreign)
library(openxlsx)

# 设置工作目录和输出目录
setwd("D:\\2007lucc\\clipforest_dbf\\8")
out_folder <- "8"

# 获取所有.dbf文件
dbf_files <- list.files(pattern = "\\.dbf$")
dbf_files

# 遍历所有.dbf文件
for (file in dbf_files) {
  # 读取.dbf文件
  dbf_data <- read.dbf(file)
  # 构造输出路径和文件名
  out_file <- file.path(out_folder, paste0(out_folder, tools::file_path_sans_ext(file), ".xlsx"))
  # 将数据写入.xlsx文件
  write.xlsx(dbf_data, out_file)
  message(paste0("Converted ", file, " to ", out_file))
}

6. excel表格中生成重复数据

##--------------------------------------------------------------------------------------
# @author:Jackson Zhao
# @time:2023/3/24 19:20:03
# @description:文件夹下有多个Excel表格,每个excel表格中有2列数据,第一列列名为value,第二列列名为Count,
#               以第一列的数据为基础,将其生成对应的第二列数值个数的重复数据,例如,第一列数据为297,第二列数据为25,
#               即生成25个297,并将所有数据保存为一列。为每个Excel表生成一个对应的.csv文件,
#               文件名按照其对应的.xlsx的文件名命名
library(tidyverse)

# 设置工作目录
setwd("D:/clip/8")

# 获取所有Excel文件的文件名
excel_files <- list.files(pattern = "*.xlsx")
excel_files

# 定义一个函数,用于处理单个Excel文件
process_excel <- function(file) {
  # 读取Excel文件
  df <- read_excel(file)
  
  # 将数据展开成重复的向量
  values <- rep(df$Value, df$Count)
  
  # 将向量转换为数据框,并且将列名设置为"value"
  output_df <- data.frame(value = values)
  
  # 构造输出文件名,并将数据保存为CSV文件
  output_file <- paste0(tools::file_path_sans_ext(file), ".csv")
  write_csv(output_df, output_file)
}

# 遍历所有Excel文件,并处理每个文件
lapply(excel_files, process_excel)

7. 表格数据按列合并!!!

这里我花了很多时间编写,得出来以下的结论:

注意:R语言合并数据时要求所有数据的行数相同,否则无法进行合并,会报错:

Error in data.frame(…, check.names = FALSE) :
参数值意味着不同的行数: 33, 1064

  这个代码假设所有.csv文件都在同一个文件夹中,并且它们都只有一列数据。它将所有数据列并排放置在新的csv文件中,其中列名是原始文件名(不带.csv后缀)。如果某些csv文件中的行数不同,则该代码将生成带有缺失值的数据框。

代码思路:
  1、找到所有.csv文件中最大的行数,a;
  2、将所有.csv文件用“-1”填充到最大行数;
  3、数据合并

##----------------------------------------------------------------------------------------
# @author:Jackson Zhao
# @time:2023/3/24 23:51:06
# @description:设置工作目录为该文件夹
library(tidyverse)

setwd("D:\\clipforest_dbf\\data")
# 获取文件夹中的所有.csv文件
csv_files <- list.files(path = "D:\\clipforest_dbf\\data", pattern = "\\.csv$")

# 定义一个函数用于读取文件并返回行数
get_row_count <- function(file_path) {
  # 读取csv文件
  df <- read.csv(file_path, header = TRUE)
  # 返回行数
  nrow(df)
}

# 使用lapply函数调用get_row_count函数并返回行数向量
row_counts <- unlist(lapply(csv_files, get_row_count))
row_counts
# 打印每个文件的行数
cat("文件名\t行数\n")
for (i in seq_along(csv_files)) {
  cat(paste0(basename(csv_files[i]), "\t", row_counts[i], "\n"))
}

# 找到最大的行数a
a <- max(row_counts)
a

# 循环处理每个.csv文件
for (file in csv_files) {
  # 读取数据
  temp_data <- read.csv(file, header = FALSE)
  # 获取第一列的行数
  n_rows <- nrow(temp_data)
  # 创建长度为1065的向量,填充为-1
  new_col <- rep(-1, a)
  # 将读取的数据填充到新的向量中
  if (n_rows >= a) {
    new_col <- temp_data[1:a, 1]
  } else {
    new_col[1:n_rows] <- temp_data[, 1]
  }
  # 将新向量转换为数据框,并写入新的.csv文件中
  new_data <- data.frame(new_col)
  write.csv(new_data, file = paste0(file, "_processed.csv"), row.names = FALSE)
}

# 指定文件夹路径和要读取的csv文件列表
csv_files <- list.files(folder_path, pattern = "*.csv", full.names = TRUE)
csv_files

# 读取所有csv文件并将它们合并到一个数据框中
data_list <- lapply(csv_files, function(x) read_csv(x, show_col_types = FALSE))
data_list
merged_data <- bind_cols(data_list)

# 重命名列名
colnames(merged_data) <- gsub(".csv", "", basename(csv_files))

# 保存合并后的数据框为.csv文件
write_csv(merged_data, "merge.csv")

write.xlsx(merged_data, "merge.xlsx")

相关文章:

  • Java开发环境配置
  • JS手写Promise(详细过程)
  • Postman接口测试之断言
  • C语言基础 — ( C语言的链表实例)
  • 社科院与杜兰大学金融管理硕士项目,承载着你读研时光的喜与乐
  • 再了解一点Ribbon的重试机制
  • MySQL5.7安装教程
  • Python 3.9 有什么新变化 - 新的特性
  • 为什么我们认为GPT是一个技术爆炸
  • JavaSE进阶之(十六)枚举
  • [数据结构]直接插入排序、希尔排序
  • 10个杀手级应用的Python自动化脚本
  • Python截图自动化工具
  • avue强大的upload表单项内置方法的使用,用这个可以配合$DialogForm.show()弹框完美使用上传控件
  • C语言高级操作(四)——exex函数族
  • 一行代码“黑”掉任意网站
  • 蓝桥杯刷题冲刺 | 倒计时18天
  • 软件测试拿了几个20K offer,分享一波面经
  • 【面试题】大厂面试官:你做过什么有亮点的项目吗?
  • vue后台管理系统