R: data.frame 生成、操作数组。重命名、增、删、改

本文详细介绍了如何在R中创建和操作数据框(data.frame),包括生成数据框、修改数据框结构(如重命名、增加或删除行列)、以及如何通过索引进行数据选择等关键操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

###################################################

问题:生成、操作数据框   18.4.27

         怎么生成数据框 data.frame、,,及其相关操作 ???

解决方案:

         iris[,2,drop = FALSE]   #用drop参数,控制截取的子集所生成变量的格式,为单列的"数据框"

         dfm1 <- cbind(c1,c2,c3,c4);   #cbind 要求向量c1 c2 c3 c4长度必须一样。

         dfm2 <- rbind(c1,c2,c3,c4)    #将数据以行进行结合。要求数据列数一样。

                   # dfm1 和 dfm2 就互为转置。

         as.data.frame(matrix)

         #相关操作:

         dfm[1,];  #返回 第一行

         dfm[,2];   #返回 第二列

         dfm[1:5,2];   #返回 第一到五行,的第二列元素

         dfm[1,2:5];  #返回 第一行,的第二到五列元素

         dfm[,c(2,4)];  #返回 第二和第四列

         dfm[,c(-2,-4)];  #返回 除第二和第四列外的所有其他列,均有效

         dfm["name",];    #返回名为 “name” 的行

         dfm[["name"]]    #返回列名为 “name” 的列,一次只能返回一列

         dfm$name  #效果同上

讨论扩展:

         行名重命名:row.names(iris1) <- iris1$ID

         列名重命名:names(iris1)[names(iris1) == "temp"] <- "new_name"

         aa = c(1,2,2,5,87);

         Dfrm = data.frame(col1 = 2*aa,col2=aa+1,col3 = aa,col4=sqrt(aa))

                   #生成数据框,会按照最长的向量取其长度,短的自动循环补足

                   #data.frame特点:1、可以不影响原向量基础上改变数据;2、可以结合不同类型的数据;

另请参阅:

 

###################################################

问题:数据框 data.frame 重命名、增、删、改、等,   18.4.27

         怎么对数据框 data.frame实施 增行列、删行列、改元素与赋值、 ???

解决方案:

#增加列 

  iris1 <- transform(iris1,log.SL=log(Sepal.Length))   #添加,修改数据。iris.add.col是数据集iris加上一列log.SL得到的。

          iris1 <- cbind(iris1[,1:3],iris1$Species,iris1[,4:ncol(iris1)])   #插入到第四列,如果指定插入到某列后面,用行名查看指定的列是第几列,再执行本句

                        student$Age <- as.integer(format(Sys.Date(),”%Y”))-as.integer(format(student$Birthdate,”%Y”))

#删除列 

  iris.del.col <- transform(iris,Sepal.Length=NULL)    #删除 Sepal.Length 列,新子集赋值给iris.del.col

  iris.del.col2 <- subset(iris,select = -Sepal.Width)    #删除 Sepal.Width 列,新子集赋值给iris.del.col2

  iris$Sepal.Length = NULL  

  iris.del.col$Species <- iris.del.col$Petal.Width <- NULL   #直接在原data.frame 删除了两列。

  iris[c(-1,-3)] <- rep("NULL",length(iris)-2)   #留下第一第三列,删除其他列。。。

#增加行 rbind()

  v[length(v)+1] <- new_data

  total1 <- rbind(dataframeA, dataframeB)    #两个数据框必须有相同的变量,不过它们的顺序可以不一样。

#删除行 iris.del.row <- iris[-8,]

  iris.del.row <- iris[c(-1,-8),]

讨论扩展:

         #找出最大元素的下标   which.max(x)

         #等于6.0的元素的下标   which(x==6.0)

         # 大于5的元素的下标   which(x>5)

         #append(v,10,after=3)在第三个元素后面加入10,新向量 <- (原向量,新元素) ,添加元素的及合并向量

           x=iris[,1];        x[x==5.1]<-25;  x     #将x中等于5.1的元素变为25

           x <- c(1,2,NA,4,5)

           x[is.na(x)] <- 0

         #合并文件,根据一列共同的标识符(比如唯一的id号)去合并两个变量。

         #添加列:merge

         ii = merge(inew,irisnew,by = "num",all = TRUE,sort=FALSE) 

# all 为TRUE则取并集,无值补NA,,为FALSE则取交集。。 sort默认为T,即按照“num”排序。

#按共同标识符,即共同列 “num”,合并文件inew和irisnew,,第一个文件在前,后一个在后。

         merge(x, y, by = c("k1","k2"))    # ?merge 自带例子。      

另请参阅:

 

转载于:https://www.cnblogs.com/li-20151130/p/9028634.html

import pickle import numpy as np import matplotlib.pyplot as plt from PIL import Image import sys def load_pkl_data(/Users/yangguang/Documents/python_workspace/data/2025-07-15T14:55:55.540272.pkl): """安全加载PKL文件数据""" try: with open(/Users/yangguang/Documents/python_workspace/data/2025-07-15T14:55:55.540272.pkl, 'rb') as f: # 尝试不同编码方式解决兼容性问题 try: return pickle.load(f) except UnicodeDecodeError: return pickle.load(f, encoding='latin1') except Exception as e: print(f"加载PKL文件失败: {str(e)}") sys.exit(1) def diagnose_data_structure(data): """诊断数据结构并返回报告""" report = { 'data_type': type(data).__name__, 'keys': [], 'nested_levels': 0, 'contains_image': False } if isinstance(data, dict): report['keys'] = list(data.keys()) # 检查嵌套层级 def count_nesting(obj, level=1): if isinstance(obj, dict): return max([count_nesting(v, level+1) for v in obj.values()] + [level]) elif isinstance(obj, (list, tuple)): return max([count_nesting(item, level+1) for item in obj] + [level]) if obj else level return level report['nested_levels'] = count_nesting(data) # 检查是否包含图像数据 for value in data.values(): if isinstance(value, np.ndarray) and value.ndim in (2, 3): report['contains_image'] = True break return report def find_image_data(data, depth=0, max_depth=5): """在数据结构中递归查找图像数据""" # 防止无限递归 if depth > max_depth: return None # 如果是NumPy数且符合图像维度 if isinstance(data, np.ndarray): if data.ndim == 2: # 灰度图像 (高度, 宽度) return data elif data.ndim == 3: # 彩色图像 (高度, 宽度, 通道) return data # 如果是字典,检查常见键名 if isinstance(data, dict): # 常见图像键名列表 image_keys = ['image', 'img', 'data', 'pixels', 'array', 'frame', 'picture'] # 优先检查常见键名 for key in image_keys: if key in data: result = find_image_data(data[key], depth+1, max_depth) if result is not None: return result # 深度搜索所有值 for value in data.values(): result = find_image_data(value, depth+1, max_depth) if result is not None: return result # 如果是列表或元 elif isinstance(data, (list, tuple)): for item in data: result = find_image_data(item, depth+1, max_depth) if result is not None: return result return None def analyze_image(image_data): """分析图像数据并返回信息""" if not isinstance(image_data, np.ndarray): try: # 尝试转换为NumPy数 image_data = np.array(image_data) except Exception as e: return {"error": f"无法转换为图像数: {str(e)}"} info = { 'dimensions': image_data.ndim, 'shape': image_data.shape, 'dtype': str(image_data.dtype), 'resolution': None, 'channels': None } # 获取分辨率 if image_data.ndim == 2: # 灰度图像 (高度, 宽度) height, width = image_data.shape info['resolution'] = f"{width}×{height}" info['channels'] = 1 elif image_data.ndim == 3: # 彩色图像 (高度, 宽度, 通道) height, width, channels = image_data.shape info['resolution'] = f"{width}×{height}" info['channels'] = channels return info def display_images(image_data, num_images=6, title="提取的图像数据"): """显示图像数据""" if not isinstance(image_data, np.ndarray): print("无法显示: 图像数据不是NumPy数") return # 处理单个图像 if image_data.ndim == 2 or (image_data.ndim == 3 and image_data.shape[2] in [1, 3, 4]): plt.figure(figsize=(6, 6)) plt.imshow(image_data, cmap='gray' if image_data.ndim == 2 or image_data.shape[2] == 1 else None) plt.title(title) plt.axis('off') plt.show() return # 处理多个图像 if image_data.ndim == 4: # 图像集合 (数量, 高度, 宽度, 通道) num_images = min(num_images, image_data.shape[0]) fig, axes = plt.subplots(1, num_images, figsize=(12, 3)) for i in range(num_images): ax = axes[i] if num_images > 1 else axes img = image_data[i] if img.shape[2] == 1: # 单通道灰度图 ax.imshow(img[:, :, 0], cmap='gray') else: # 多通道彩色图 ax.imshow(img) ax.axis('off') plt.suptitle(f"{title} (前{num_images}张)") plt.tight_layout() plt.show() def main(pkl_file): """主处理函数""" print(f"加载文件: {pkl_file}") data = load_pkl_data(pkl_file) # 诊断数据结构 print("\n=== 数据结构诊断 ===") report = diagnose_data_structure(data) print(f"数据类型: {report['data_type']}") print(f"包含的键: {report['keys'][:10]}{'...' if len(report['keys']) > 10 else ''}") print(f"嵌套层级: {report['nested_levels']}") print(f"包含图像数据: {'是' if report['contains_image'] else '否'}") # 查找图像数据 print("\n=== 搜索图像数据 ===") image_data = find_image_data(data) if image_data is None: print("错误: 未找到图像数据") return # 分析图像 print("\n=== 图像分析 ===") image_info = analyze_image(image_data) print(f"图像维度: {image_info['dimensions']}") print(f"图像形状: {image_info['shape']}") if image_info['resolution']: print(f"分辨率: {image_info['resolution']}") print(f"通道数: {image_info['channels']}") else: print("警告: 无法确定分辨率") # 显示图像 print("\n=== 显示图像 ===") display_images(image_data) if __name__ == "__main__": # 替换为您的PKL文件路径 PKL_FILE = "image_data.pkl" main(PKL_FILE) 在Mac上运行该代码 有问题 帮我
07-16
import numpy as np import struct import json import os import sys import time from datetime import datetime def save_dark_cal_with_header(calibration_data, filename, camera_model="ICX285"): """ 保存工业相机暗场校准文件(含可读文本头) 参数: calibration_data: 字典列表,每个字典包含: 'exposure_ms': 曝光时间(毫秒) 'dark_frame': 暗场图像(numpy uint16数) 'sensor_temp': 传感器温度(℃) 'timestamp': 采集时间戳(可选) filename: 输出文件名 camera_model: 相机型号标识 """ # 验证输入数据 if not calibration_data: raise ValueError("校准数据不能为空") # 创建文本头信息 text_header = create_text_header(calibration_data, camera_model) # 创建二进制数据块 binary_data = create_binary_data(calibration_data) # 原子写入文件 temp_filename = f"{filename}.tmp" try: with open(temp_filename, 'wb') as f: # 写入文本头(UTF-8编码) f.write(text_header.encode('ANSI')) # 写入分隔符(标记文本头结束) f.write(b'\n\nBINARY_DATA_START\n\n') # 写入二进制数据 f.write(binary_data) # 原子操作重命名 os.replace(temp_filename, filename) return True except Exception as e: print(f"保存失败: {str(e)}") if os.path.exists(temp_filename): os.remove(temp_filename) return False def create_text_header(calibration_data, camera_model): """创建可读文本头文件""" # 基础信息 header = f"Industrial Dark Calibration File\n" header += f"Camera Model: {camera_model}\n" header += f"Creation Date: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n" header += f"Frame Count: {len(calibration_data)}\n" # 图像尺寸信息 width = calibration_data[0]['dark_frame'].shape[1] height = calibration_data[0]['dark_frame'].shape[0] header += f"Image Size: {width}x{height} pixels\n" header += f"Data Type: uint16\n" header += f"Byte Order: {sys.byteorder}-endian\n\n" # 校准帧详细信息 header += "Calibration Frames:\n" header += "Index | Exposure(ms) | Temperature(℃) | Timestamp\n" header += "------|-------------|----------------|-----------------------\n" for i, data in enumerate(calibration_data): timestamp = datetime.fromtimestamp( data.get('timestamp', time.time()) ).strftime('%Y-%m-%d %H:%M:%S') header += ( f"{i + 1:5} | " f"{data['exposure_ms']:11.2f} | " f"{data['sensor_temp']:14.1f} | " f"{timestamp}\n" ) # 添加注释和元数据 header += "\nNotes:\n" header += "1. Binary data starts after 'BINARY_DATA_START' marker\n" header += "2. Each frame is stored as: [exposure(4B)][width(4B)][height(4B)][data]\n" header += "3. Exposure time stored as float32 (milliseconds)\n" return header def create_binary_data(calibration_data): """创建二进制数据块""" binary_data = bytearray() endian = '<' if sys.byteorder == 'little' else '>' frame_format = f'{endian}fII' # 曝光(ms), 宽度, 高度 for data in calibration_data: frame = data['dark_frame'] width, height = frame.shape[1], frame.shape[0] # 打包帧头 frame_header = struct.pack( frame_format, data['exposure_ms'], width, height ) # 添加帧头和图像数据 binary_data.extend(frame_header) binary_data.extend(frame.tobytes()) return binary_data # 使用示例 if __name__ == "__main__": # 创建不同曝光的暗场数据 calibration_data = [ { 'exposure_ms': 2.0, 'dark_frame': np.random.randint(0, 100, (768, 1024), dtype=np.uint16), 'sensor_temp': 25.0 }, { 'exposure_ms': 50.0, 'dark_frame': np.random.randint(0, 500, (768, 1024), dtype=np.uint16), 'sensor_temp': 25.3 }, { 'exposure_ms': 200.0, 'dark_frame': np.random.randint(0, 2000, (768, 1024), dtype=np.uint16), 'sensor_temp': 26.1 } ] # 保存带文本头的校准文件 success = save_dark_cal_with_header( calibration_data, "industrial_dark_calibration.dcl", camera_model="IMX342" ) if success: print("带文本头的暗场校准文件保存成功!") print("可用文本编辑器查看文件头部信息") 读取以上程序生成的暗场校准文件,用于图像暗场校准
最新发布
08-16
import tkinter as tk from tkinter import * # 导入GUI库的基础模块 from tkinter import ttk,filedialog,messagebox # 导入更漂亮的控件样式 from bubble import Bubble # 自定义的冒泡排序类 from selection import Selection from insertion import Insertion from shellsort import Shell import pandas as pd # 数据处理库,用于读取CSV import time # 计时功能 import os # 操作系统功能,用于获取文件路径 import random from PIL import Image, ImageTk, ImageSequence import threading window = Tk() window.title("排序方法") window.geometry("1200x800+300+100") # 设置窗口大小和位置(宽x高+X坐标+Y坐标) current_file = "" arr = [] filename ="sort.csv" BATCH_SIZE = 10000 gif_frame = [] gif_index = 0 gif_speed = 200 gif_after = None gif_label = None # 全局变量 def load_gif(file_path,size=(400,300)): global gif_frame,gif_index gif_frame =[] img = Image.open(file_path) for frame in ImageSequence.Iterator(img): resized = frame.copy().resize(size, Image.Resampling.BILINEAR) gif_frame.append(ImageTk.PhotoImage(resized)) gif_index = 0 return bool(gif_frame) def open_gif(): global gif_index,gif_after if gif_frame: gif_label.config(image=gif_frame[gif_index]) gif_index = (gif_index + 1) % len(gif_frame) gif_after = window.after(gif_speed,open_gif) def update_gif(file_path): global gif_after, gif_frame, gif_index if gif_after: window.after_cancel(gif_after) if load_gif(file_path, size=(500, 300)): open_gif() else: gif_label.config(text=f"GIF 加载失败: {file_path}") def load_data(file_path): # 加载CSV文件数据 global arr, current_file # global 全局变量用的函式,不然不了 chunks = [] total_size = os.path.getsize(file_path) processed = 0 for chunk in pd.read_csv(file_path, chunksize=2000): chunks.append(chunk) processed += chunk.memory_usage(index=True, deep=True).sum() progress_value = min(processed / total_size * 100, 100) if os.path.exists(file_path): df = pd.concat(chunks) arr = df.values.flatten().tolist() current_file = os.path.basename(file_path) update_treeview(unsort_tree, arr) update_treeview(sort_tree, []) def update_treeview(treeview, data): treeview.delete(*treeview.get_children()) for value in data: treeview.insert("", "end", values=(value)) def update_treeview_batch(treeview, data): """分批更新Treeview控件""" treeview.delete(*treeview.get_children()) total = len(data) def add_batch(start_idx=0): end_idx = min(start_idx + BATCH_SIZE, total) for i in range(start_idx, end_idx): treeview.insert("", "end", values=(data[i],)) if end_idx < total: # 使用计时器安排下一批处理 treeview.after(1, add_batch, end_idx) else: treeview.yview_moveto(1.0) def generate_random_data(): global arr try: count = int(entry.get()) if count < 100: messagebox.showerror("错误", "请输入100以上的数字") return # 清空现有数 arr = [] # 启动线程生成数据 threading.Thread(target=generate_data_thread, args=(count,), daemon=True).start() except ValueError: messagebox.showerror("错误", "请输入有效的数字") def generate_data_thread(count): global arr, current_file, stop_sorting arr = [] # 确保数为空 stop_sorting = False # 分批生成数据 for i in range(0, count, BATCH_SIZE): batch_size = min(BATCH_SIZE, count - len(arr)) batch = [] for _ in range(batch_size): rand_type = random.choice(["int", "float"]) # 控制整数和浮点数的比例 if len(arr) < count * 0.7: # 70% 整数 batch.append(random.randint(-100000, 100000)) else: batch.append(round(random.uniform(-100000, 100000), 3)) arr.extend(batch) update_treeview(unsort_tree, arr) update_treeview(sort_tree, []) # 保存数据 current_file = "random_data.csv" pd.DataFrame(arr).to_csv(current_file, index=False) def file(): file_path = filedialog.askopenfilename( title="选择数据文件", filetypes=[("CSV文件", "*.csv"), ("所有文件", "*.*")] ) if file_path: load_data(file_path) def choose(): choose = var.get() arr_copy = arr.copy() # 创建数据副本(避免修原始数据) start_time = time.time() if choose == "bubblesort": sorter = Bubble() # 创建冒泡排序对象 sorter_arr,steps = sorter.sort(arr_copy) # 调用排序方法 title="冒泡排序" elif choose == "selectionsort": sorter = Selection() sorter_arr,steps = sorter.sort(arr_copy) title="选择排序" elif choose == "shellsort": sorter = Shell() sorter_arr, steps = sorter.sort(arr_copy) title = "希尔排序" else: sorter = Insertion() sorter_arr,steps = sorter.sort(arr_copy) title="插入排序" # sorting_thread = threading.Thread(target=choose, daemon=True) # sorting_thread.start() elapsed_time = time.time() - start_time filename = "sort.csv" with open(filename,"a",encoding="utf-8") as f: f.write(f"\n{title}\n") f.write("\n".join(map(str,sorter_arr))) # 将排序结果转为字符串并用换行符连接 label1["text"] = f"排序耗时: {elapsed_time:4f} 秒" label2["text"] = f"运算步数: {steps}" label3["text"] = f"结果保存至:\n{os.path.abspath(filename)}" update_treeview(sort_tree, sorter_arr) def open_file(event=None): """打开文件所在的文件夹""" file_path = os.path.abspath(filename) if file_path and os.path.exists(file_path): os.startfile(file_path) def on_combobox_select(event=None): algorithm = var.get() gif_map = { "bubblesort": "bubble.gif", "selectionsort": "sele.gif", "insertionsort": "inster.gif", "quicksort": "quick.gif", "mergesort": "merge.gif", "shellsort":"shell.gif", "cocktailsort": "cocktail.gif", "gnomesort": "gnome.gif", "combsort": "comb.gif", "countingsort": "counting.gif", "radixsort": "radix.gif", "bucketsort": "bucket.gif", "timsort": "tim.gif", "heapsort": "heap.gif" } gif_path = gif_map.get(algorithm, "sorting.gif") update_gif(gif_path) update_treeview(sort_tree, []) label1.config(text="排序耗时:") label2.config(text="运算步数:") label3.config(text="结果文件:") optuple = ("bubblesort","selectionsort","insertionsort","shellsort","cocktailsort","gnomesort","combsort", "countingsort","radixsort") var = StringVar(value=optuple[0]) # 用于存储用户选择的变量 control_frame = ttk.Frame(window) control_frame.pack(fill=tk.X, padx=10, pady=10) ttk.Label(control_frame, text="选择排序算法:").grid(row=0, column=0, padx=5, pady=5) cb = ttk.Combobox(control_frame, textvariable=var, values=optuple, state="readonly", width=15) cb.grid(row=0, column=1, padx=5, pady=5) cb.bind("<<ComboboxSelected>>", on_combobox_select) ttk.Label(control_frame, text="生成数据量:").grid(row=0, column=2, padx=5, pady=5) entry = ttk.Entry(control_frame, width=10) entry.grid(row=0, column=3, padx=5, pady=5) ttk.Button(control_frame, text="生成随机数据",command=generate_random_data).grid(row=0, column=4, padx=5, pady=5) ttk.Button(control_frame, text="选择数据文件",command=file).grid(row=0, column=5, padx=5, pady=5) ttk.Button(control_frame,text="打开结果文件",command=open_file).grid(row=0,column=6,padx=5,pady=5) ttk.Button(control_frame, text="开始排序",command=choose).grid(row=0, column=7, padx=5, pady=5) ttk.Button(control_frame, text="停止排序").grid(row=0, column=8, padx=5, pady=5) # 数据展示区域 data_frame = ttk.Frame(window) data_frame.pack(fill="both", expand=True, padx=10, pady=5) # 未排序数据 unsort_frame = ttk.LabelFrame(data_frame, text="未排序数据") unsort_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True, padx=5, pady=5) unsort_tree = ttk.Treeview(unsort_frame, columns=("value",), show="headings", height=15) unsort_tree.heading("value", text="数值") unsort_tree.column("value", width=100) unsort_tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) unsort_scrollbar = ttk.Scrollbar(unsort_frame, orient=tk.VERTICAL, command=unsort_tree.yview) unsort_scrollbar.pack(side=tk.RIGHT, fill=tk.Y) unsort_tree.configure(yscrollcommand=unsort_scrollbar.set) # 排序后数据 sort_frame = ttk.LabelFrame(data_frame, text="排序后数据") sort_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True, padx=5, pady=5) sort_tree = ttk.Treeview(sort_frame, columns=("value",), show="headings", height=15) sort_tree.heading("value", text="数值") sort_tree.column("value", width=100) sort_tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) # 添加pack sort_scrollbar = ttk.Scrollbar(sort_frame, orient=tk.VERTICAL, command=sort_tree.yview) sort_scrollbar.pack(side=tk.RIGHT, fill=tk.Y) sort_tree.configure(yscrollcommand=sort_scrollbar.set) gif_frame = ttk.Frame(window) gif_frame.pack(fill=tk.X, padx=10, pady=5) gif_label = ttk.Label(gif_frame) gif_label.pack() # 状态信息 status_frame = ttk.Frame(window) status_frame.pack(fill=tk.X, padx=10, pady=5) label1 = ttk.Label(status_frame, text="排序耗时:") label1.grid(row=0, column=0, padx=10, pady=5, sticky="w") label2 = ttk.Label(status_frame, text="运算步数:") label2.grid(row=0, column=1, padx=10, pady=5, sticky="w") label3 = ttk.Label(status_frame, text="结果文件:") label3.grid(row=0, column=2, padx=10, pady=5, sticky="w") update_gif("bubble.gif") window.mainloop() 如何使用threading来使选择数据文件和生产数据文件的大笔资料能够排序
07-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值