R 语言 | 取数据框一列子集时,如何保持数据框结构?drop=F

数据框取多列时,返回的还是数据框。
取一列时,默认退化为一个向量:

> class(iris)
[1] "data.frame"
> t1=iris[, 1:2]
> class(t1)
[1] "data.frame"

> t2=iris[,1]
> class(t2)
[1] "numeric"
> head(t2, n=2)
[1] 5.1 4.9

取一列子集,还想保持数据框结构,怎么办?

答案:在[]中添加第三个参数 drop=F

> t3=iris[,1, drop=F]
> class(t3)
[1] "data.frame"
> head(t3, n=2)
  Sepal.Length
1          5.1
2          4.9

这个在Seurat4源码中经常见到。

Tips: 为了稳健(robust),函数中对数据框取列子集,都建议一律加上 drop=F 参数。

import pandas as pd # 处理表格 import numpy as np # 数值计算 from sklearn.model_selection import train_test_split # 数据集划分 from sklearn.tree import DecisionTreeRegressor #决策树模型 #from sklearn.linear_model import LinearRegression # 线性回归模型 from sklearn.metrics import mean_squared_error, r2_score # 评估指标 import matplotlib.pyplot as plt # 数据可视化 # 1. 加载数据集,注意文件路径 #data = pd.read_csv("D:/回归菠萝糖分检测/") data = pd.read_excel("D:/回归菠萝糖分检测/vnir+nir 分类.xlsx", sheet_name="virA") data = pd.read_excel("D:/回归菠萝糖分检测/vnir+nir 分类.xlsx", sheet_name="virdA") data = pd.read_excel("D:/回归菠萝糖分检测/vnir+nir 分类.xlsx", sheet_name="virlgA") #读CSV/Excel数据 pd.read_csv() #CRIM: 城镇人均犯罪率 #ZN: 住宅用地所占比例 #INDUS: 城镇中非住宅用地所占比例 #CHAS: 虚拟变量,用于回归分析 #NOX: 环保指数 #RM: 每栋住宅的房间数 #AGE: 1940 年以前建成的自住单位的比例 #DIS: 距离 5 个波士顿的就业中心的加权距离 #RAD: 距离高速公路的便利指数 #TAX: 每一万美元的不动产税率 #PTRATIO: 城镇中的教师学生比例 #B: 城镇中的黑人比例 #LSTAT: 地区中有多少房东属于低收入人群 #MEDV: 自住房屋房价中位数(也就是均价) # 2. 计算相关系数并筛选变量 correlation_matrix = data.corr() #计算数据框data中所有数值型变量之间的皮尔逊相关系数矩阵 medv_correlations = correlation_matrix["MEDV"] #从相关系数矩阵中提取MEDV这一列的相关系数,得到一个Series对象,显示所有变量与房价的相关性强弱 significant_vars = medv_correlations[medv_correlations.abs() > 0.4].index.tolist() #筛选出与房价相关系数绝对值大于0.4的变量名;.abs()绝对值(同考虑正负相关);.index.tolist()将符合条件的变量名转换为列表 significant_vars.remove("MEDV") # 移除MEDV本身,(因为变量与自身的相关系数总是1) print("与房价相关性较强的变量是(相关系数绝对值大于0.4):") print(significant_vars)#展示相关性较强的特征变量,在后续建模优先考虑 # 绘制房价分布的散点图 #Matplotlib默认不支持中文显示 plt.figure(figsize=(10, 6)) #初始化画布宽10英寸、高6英寸 plt.rcParams['font.family'] = "sans-serif" # 配置支持坐标轴和标签可以中文显示 plt.rcParams['font.sans-serif'] = "SimHei" #SimHei 是Windows系统自带的中文字体 plt.rcParams['axes.unicode_minus'] = False #修复负号可能显示为方的问题 plt.scatter(data.index, data['MEDV'], alpha=0.5) #data.index:X轴数据(使用数据集的索引列,通常代表样本序号) #data['MEDV']:Y轴数据(房价中数值型目标变量) #alpha=0.5:设置点的透明度(0=全透明,1=不透明),用于避免点重叠看不清分布 #添加标签和标题 plt.xlabel('样本索引') plt.ylabel('MEDV(房价中位数)') plt.title('MEDV分布的散点图') plt.grid(True) #显示网格线 plt.show() # 绘制各变量与房价的散点图 features = data.columns.drop('MEDV') # 获除了MEDV之外的所有特征列名 plt.figure(figsize=(10, 10))#正方形画布(适合排列多个子图) for i, feature in enumerate(features): plt.subplot(4, 4, i+1) # 创建4行4列子图 #i+1 表示当前绘制的子图位置(从左上到右下按顺序编号),超过16个会报错,需调整子图行列数 plt.scatter(data[feature], data['MEDV'], alpha=0.2,s=5,color='red') #点透明度(降低重叠干扰)# 点大小(避免密集数据糊成一片)# 统一用红色标记 plt.title(f'{feature} vs MEDV')#显示特征名称与MEDV的关系标题 plt.xlabel(feature) plt.ylabel('MEDV') plt.grid() plt.tight_layout() # 自动调整子图间距(防止标签重叠) plt.show() # 3. 删除MEDV大于等于50的样本 filtered_data = data[data["MEDV"] < 50] #波士顿房价数据集中的MEDV字段存在部分样本被人工上限设置为50的情况(实际是超出50的数值被截断),这些被截断的数据会干扰模型对真实房价分布的拟合 # 4. 准备数据集 X = filtered_data[significant_vars] # 自变量(筛选后的重要特征) y = filtered_data["MEDV"] # 因变量 # 5. 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # 测试集占比30% # 固定随机种子,确保每次划分结果一致(便于结果复现) #也可设置其他数值,0/1/77等,保证实验可重复性即可 # 6. 构建线性回归模型 model = LinearRegression() #初始化一个线性回归模型实例,默认使用普通最小二乘法求解参数。 model.fit(X_train, y_train) #通过最小化残差平方和来估计模型系数(权重)和截距,使得预测值与真实值的差异最小化。 # 7. 预测并评估模型 y_pred = model.predict(X_test) #生成预测值 mse = mean_squared_error(y_test, y_pred) #衡量预测值与真实值差异的平方的平均值,值越小表示模型精度越高。 r2 = r2_score(y_test, y_pred) #表示模型对数据的拟合程度,值范围为 0 到 1,越接近 1 说明模型能解释的数据变异性越高。 # 8. 输出结果 print("线性回归模型结果:") print(f"均方误差 (MSE): {mse:.2f}")#保留两位小数 #例如,若 MSE=2.50,表示预测值与真实值的平均平方误差为 2.50。 print(f"决定系数 (R²): {r2:.2f}") #若 R²=0.85,表示模型能解释 85% 的目标变量变异性,剩余 15% 由噪声或未被纳入模型的特征解释。 # 绘制真实值与预测值的对比图 fig = plt.figure(figsize=(13, 7)) plt.plot(range(y_test.shape[0]), y_test, color='red', linewidth=1, linestyle='-') # 真实值 #以红色实线绘制测试数据的真实值,x 轴为样本索引,y 轴为目标变量值 plt.plot(range(y_test.shape[0]), y_pred, color='blue', linewidth=1, linestyle='dashdot') # 预测值 #以蓝色点划线绘制模型的预测值,便于直观比较预测值与真实值的差异 plt.legend(['真实值', '预测值']) # 添加图例 plt.title("真实值与预测值对比图", fontsize=20) # 标题 error_text = f"均方误差d={mse:.4f}\nR^2评分={r2:.4f}" # 显示误差和R²评分 #保留四位小数 #将均方误差(MSE)和决定系数(R²)格式化为文本字符串。 plt.xlabel(error_text, size=18, color="black") # 设置x轴标签为误差和评分 plt.grid() # 添加网格 plt.show() # 绘制真实值与预测值的散点图 plt.title('真实值与预测值散点图', fontsize=24) # 标题 xx = np.arange(0, 50) # 生成x轴数据,从0到49的整数序列 yy = xx # 生成y轴数据与x轴相同 plt.xlabel('* 真实值 *', fontsize=14) # x轴标签 plt.ylabel('* 预测值 *', fontsize=14) # y轴标签 plt.plot(xx, yy) # 绘制y=x线,作为理想预测的参考线 plt.scatter(y_test, y_pred, color='red') # 绘制真实值与预测值的散点图,红色标记 plt.grid() # 添加网格 plt.show() 帮我改成用决策树预测,应该怎么改
06-03
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值