【数据挖掘】实验3:常用的数据管理

news2024/11/15 8:48:47

实验3:常用的数据管理

一:实验目的与要求

1:熟悉和掌握常用的数据管理方法,包括变量重命名、缺失值分析、数据排序、随机抽样、字符串处理、文本分词。

二:实验内容

【创建新变量】

方法1:

mydata <- iris[,1:2]

mydata$square <- mydata$Sepal.Length*mydata$Sepal.Width

方法2:

rm(list=ls())

mydata <- iris[,1:2]

attach(mydata)

mydata$square <- Sepal.Length*Sepal.Width

detach(mydata)

方法3:使用DT包(现在已经无法从CRAN下载)

rm(list=ls())

mydata <- iris[,1:2]

mydata <- transform(mydata,square=Sepal.Length*Sepal.Width)

library(DT)

datatable(mydata,rownames=F)

【变量重新编码】

Eg1:

rm(list = ls())

mydata <- mtcars

(mydata$am <- ifelse(mydata$am == 0,'automatic','manual'))

Eg2:将99岁这样的年龄重编码为缺失值

manager <- c(1,2,3,4,5)

date <- c('10/24/08','10/28/08','10/1/08','10/12/08','5/1/09')

country <- c('US','US','UK','UK','UK')

gender <- c('M','F','F','M','F')

age <- c(32,45,25,39,99)

q1 <- c(5,3,3,3,2)

q2 <- c(4,5,5,3,2)

q3 <- c(5,2,5,4,1)

q4 <- c(5,5,5,NA,2)

q5 <- c(5,5,2,NA,1)

leadership <- data.frame(manager,date,country,gender,age,q1,q2,q3,q4,q5, stringsAsFactors = FALSE)

leadership$age[leadership$age==99] <- NA

Eg3:将年龄离散化,将leadership中age(连续型变量)重新编码为类别型变量agecat

leadership$agecat[leadership$age > 66] <- "Elder"

leadership$agecat[leadership$age > 40 & leadership$age<66] <- "Middle Aged"

leadership$agecat[leadership$age >=18 & leadership$age<=40] <- "Young"

Eg4:同上,但使用within函数

leadership <- within(leadership, {agecat <- NA

  agecat[age > 75] <- 'Elder'

  agecat[age >-55 & age <=75] <- 'Middle Aged'

  agecat[age < 55] <- 'Young'})

【变量的重命名】

Eg1:

install.packages("reshape", repos = "http://cran.r-project.org")

w <- mtcars

library(reshape)

colnames(w)

w <- rename(w,c(mpg='Miles/(US) gallon',cy1='Number of Cylinders',disp='Displacement(cu.in)',hp='cross horsepower'))

colnames(w)

names(w)[5] <- 'Rear axle ratio'

names(w)

【数据排序】

Eg1:

x <- c(19, 84, 64, 2)

order(x)

rank(x)

sort(x)

【随机抽样】

Eg1:

install.packages("sampling",repos = "http://cran.r-project.org")

library(sampling)

LETTERS

(s<-srswor(10,26))

(obs<-((1:26)[s!=0]))

(sample<-LETTERS[obs])

Eg2:

library(sampling)

LETTERS

(s<-srswr(10,26))

(obs<-((1:26)[s!=0]))

(n<-s[s!=0])

(obs<-rep(obs,times=n))

(sample<-LETTERS[obs])

Eg3:

library(sampling)

LETTERS

sample(LETTERS,5,replace=TRUE)

sample(LETTERS,5,replace=FALSE)

Eg4:

library(sampling)

LETTERS

n<-sample(2,26,replace=T,prob=c(0.7,0.3))

n

(sample1 <- LETTERS[n==1])

(sample2 <- LETTERS[n==2])

【数学函数】

Eg1:

x <- c(1.12, -1.234, 3.1, 2.3, -4)

abs(x)

sqrt(25)

ceiling(x)

floor(x)

round(x,digits=1)

signif(x,digits=1)

【统计函数】

方法1:

mean(rivers)

median(rivers)

sd(rivers)

var(rivers)

quantile(rivers,c(.3,.84))

range(rivers)

min(rivers)

max(rivers)

【基本函数】

Eg1:鸢尾花数据集操作

head(iris)

colnames(iris)

names(iris)

sum(iris$Sepal.Length)

max(iris$Sepal.Length)

min(iris$Sepal.Length)

which.max(iris$Sepal.Length)

which.min(iris$Sepal.Length)

range(iris$Sepal.Length)

 

 

【高级函数】

Eg1:鸢尾花数据集操作

(x<-rnorm(1))

round(x,2)

index<-sample(1:150,30)

iris1<-iris$Sepal.Length[index]

sort(iris1)

order(iris1)

【概率函数】

Eg1:

data<-rnorm(20)

data

dnorm(data)

pnorm(data)

qnorm(0.9,mean=0,sd=1)

【字符串操作】

Eg1:字符串长度

data<-'R语言是一门艺术'

nchar(data)

Eg2:字符串合并

data1<-'用心去体会'

paste(data,data1,sep="")

 

Eg3:paste函数合并

paste("AB",1:5,sep="")

x<-list(a="1st",b="2nd",c="3rd")

y<-list(d=1,e=2)

paste(x,y,sep="-")

paste(x,y,sep="-",collapse=";")

paste(x,collapse=",")

Eg4:分割字符串

data<-c("2016年1月1日","2016年2月1日")

strsplit(data,"年")

strsplit(data,"年")[[1]][1]

Eg5:字符串替换

txt <- c("Whatever","is","worth","doing","is","worth","doing","well")

sub("[tr]","k",txt)

gsub("[tr]","k",txt)

Eg6:

(x<-'abadfa')

(substr(x,2,4))

substr(x,2,4)<-'kkk'

x

Eg7:

(x<-'abadfaf')

(x<-chartr('k','h',x))

(x<-chartr('faf','tBt',x))

(x<-chartr('faf','ttt',x))

(x<-chartr('af','Tt',x))

【jiebaR】

Eg1:(由于未找到data.txt文件,因此未对文件进行分词)

install.packages("jiebaR",repos = "http://cran.r-project.org")

library(jiebaR)

mixseg <- worker()

mpseg <- worker(type="mp")

hmmseg <- worker(type="hmm")

word = "人们都说桂林山水甲天下"

mixseg <= word

mpseg <= word

hmmseg <= word

segment(word,mixseg)

qseg <= word

qseg[word]

【apply家族】

Eg1:鸢尾花维度处理

apply(iris[,1:4],1,mean)

sapply(iris,mean)

lapply(iris[,1:4],mean)

Eg2:对列表x的每一个元素计算均值

x <- list(a=1:5,b=exp(0:3))

lapply(x,mean)

Eg3:计算矩阵x各行各列的均值

x<-matrix(1:20,ncol=4)

x

apply(x,1,mean)

apply(x,2,mean)

Eg4:列表list中的元素与数字1-3连接,并以矩阵和列表两种形式输出

list<-list(c("a","b","c"),c("A","B","C"))

list

sapply(list,paste,1:3,simplify=T)

sapply(list,paste,1:3,simplify=F)

【数据汇总统计】

Eg1:

attach(mtcars)

colnames(mtcars)

aggregate(mtcars[,c(1,3)],by=list(cyl,gear),FUN=mean)

【数据融合】

Eg1:melt函数融合数据框和数组

library(reshape)

head(airquality)

air_melt <- melt(airquality,id=c("Ozone","Month","Day"),na.rm=TRUE)

head(air_melt)

a <- array(c(1:11,NA),c(2,3,2))

a

a_melt <- melt(a,na.rm=TRUE,varnames=c("X","Y","Z"))

a_melt

【数据重塑】

Eg1:

install.packages("reshape2")

library(reshape2)

air_cast <- dcast(air_melt,Month~variable,fun.aggregate=mean)

air_cast

【粘贴数据结构】

Eg1:数据框加载

authors <- data.frame(

  surname=I(c('Tukey','venables','Tierney','Ripley','McNeil')),

  nationality=c('US','Australia','US',"UK",'Australia'),

  deceased=c('yes',rep('no',4))

)

books<-data.frame(

  name=I(c('Tukey','Venables','Tierney','Ripley','Ripley','McNeil','R core')),

  title=c('Exploratory Data Analysis',

          'Modern Applied statistics...',

          'LISP-STAT',

          'Spatial Statistics',

          'Stochastic Simulation',

          'Interactive Data Analysis',

          'An Introduction to R'),

  other.author = c(NA,'Ripley',NA,NA,NA,NA,'Venables & Smi')

)

Eg2:merge函数

(m1<-merge(authors,books,by.x='surname',by.y='name',all=F))

merge(authors,books,by.x='surname',by.y='name',all=T)

【转换函数】

Eg1:transform函数

head(airquality)

head(transform(airquality,Ozone=-Ozone))

head(transform(airquality,new=-Ozone))

【while循环语句】

Eg1:

pv <- c(1,1,2,3,1,1,15,7,18)

i<-1

result<-""

length(pv)

while(i<=length(pv)){

  if(pv[i]<=5){

    result[i] <- "初级用户"

  }else if(pv[i]<=15){

    result[i] <- "中级用户"

  }else{

    result[i] <- "高级用户"

  }

  i <- i+1

}

result

【for循环】

Eg1:不知道循环次数

pv <- c(1,1,2,3,1,1,15,7,18,1,1,2,3,1,1)

result<-""

m<-1

for(i in pv){

  if(i<=5){

    result[m]<-"初级用户";

  }else if(i<=15){

    result[m]<-"中级用户";

  }else{

    result[m]<-"高级用户";

  }

  m<-m+1

}

result

Eg2:知道循环次数

pv <- c(1,1,2,3,1,1,15,7,18,1,1,2,3,1,1)

result<-""

for(i in 1:length(pv)){

  if(pv[i]<=5){

    result[i]<-"初级用户";

  }else if(pv[i]<=15){

    result[i]<-"中级用户";

  }else{

    result[i]<-"高级用户";

  }

}

result

【repeat-break循环】

Eg1:

pv <- c(1,1,2,3,1,1,15,7,18)

i<-1

result<-""

repeat{

  if(i>length(pv)){

    break

  }

  if(pv[i]<=5){

    result[i]<-"初级用户"

  }else if(pv[i]<=15){

    result[i]<-"中级用户"

  }else{

    result[i]<-"高级用户"

  }

  i<-i+1

}

result

【自定义函数】

Eg1:自定义一个求两数之和的函数

s <- function(x,y){

  a<-x+y

  return(a)

}

s(2,3)

三:课堂练习

【练习1】PPT-05第27页

案例1:

scale(cars,center=T,scale=F) # centrialize

scale(cars,center=T,scale=T) # standarlize

diff(cars[,1]) # differentiate

案例2:

date <- c("2016-01-27","2016-02-27")

difftime(date[2],date[1],units="days")

difftime(date[2],date[1],units="weeks")

【练习2】PPT-05第27页

案例1:subset函数选定特定行或子集

subset(airquality, Temp > 80, select = c(Ozone, Temp))

案例2:

subset(airquality, Day == 1, select=-Temp)

案例3:

subset(airquality, select = Ozone:Wind)

详细结果如下表所示

    Ozone Solar.R Wind

1      41     190  7.4

2      36     118  8.0

3      12     149 12.6

4      18     313 11.5

5      NA      NA 14.3

6      28      NA 14.9

7      23     299  8.6

8      19      99 13.8

9       8      19 20.1

10     NA     194  8.6

11      7      NA  6.9

12     16     256  9.7

13     11     290  9.2

14     14     274 10.9

15     18      65 13.2

16     14     334 11.5

17     34     307 12.0

18      6      78 18.4

19     30     322 11.5

20     11      44  9.7

21      1       8  9.7

22     11     320 16.6

23      4      25  9.7

24     32      92 12.0

25     NA      66 16.6

26     NA     266 14.9

27     NA      NA  8.0

28     23      13 12.0

29     45     252 14.9

30    115     223  5.7

31     37     279  7.4

32     NA     286  8.6

33     NA     287  9.7

34     NA     242 16.1

35     NA     186  9.2

36     NA     220  8.6

37     NA     264 14.3

38     29     127  9.7

39     NA     273  6.9

40     71     291 13.8

41     39     323 11.5

42     NA     259 10.9

43     NA     250  9.2

44     23     148  8.0

45     NA     332 13.8

46     NA     322 11.5

47     21     191 14.9

48     37     284 20.7

49     20      37  9.2

50     12     120 11.5

51     13     137 10.3

52     NA     150  6.3

53     NA      59  1.7

54     NA      91  4.6

55     NA     250  6.3

56     NA     135  8.0

57     NA     127  8.0

58     NA      47 10.3

59     NA      98 11.5

60     NA      31 14.9

61     NA     138  8.0

62    135     269  4.1

63     49     248  9.2

64     32     236  9.2

65     NA     101 10.9

66     64     175  4.6

67     40     314 10.9

68     77     276  5.1

69     97     267  6.3

70     97     272  5.7

71     85     175  7.4

72     NA     139  8.6

73     10     264 14.3

74     27     175 14.9

75     NA     291 14.9

76      7      48 14.3

77     48     260  6.9

78     35     274 10.3

79     61     285  6.3

80     79     187  5.1

81     63     220 11.5

82     16       7  6.9

83     NA     258  9.7

84     NA     295 11.5

85     80     294  8.6

86    108     223  8.0

87     20      81  8.6

88     52      82 12.0

89     82     213  7.4

90     50     275  7.4

91     64     253  7.4

92     59     254  9.2

93     39      83  6.9

94      9      24 13.8

95     16      77  7.4

96     78      NA  6.9

97     35      NA  7.4

98     66      NA  4.6

99    122     255  4.0

100    89     229 10.3

101   110     207  8.0

102    NA     222  8.6

103    NA     137 11.5

104    44     192 11.5

105    28     273 11.5

106    65     157  9.7

107    NA      64 11.5

108    22      71 10.3

109    59      51  6.3

110    23     115  7.4

111    31     244 10.9

112    44     190 10.3

113    21     259 15.5

114     9      36 14.3

115    NA     255 12.6

116    45     212  9.7

117   168     238  3.4

118    73     215  8.0

119    NA     153  5.7

120    76     203  9.7

121   118     225  2.3

122    84     237  6.3

123    85     188  6.3

124    96     167  6.9

125    78     197  5.1

126    73     183  2.8

127    91     189  4.6

128    47      95  7.4

129    32      92 15.5

130    20     252 10.9

131    23     220 10.3

132    21     230 10.9

133    24     259  9.7

134    44     236 14.9

135    21     259 15.5

136    28     238  6.3

137     9      24 10.9

138    13     112 11.5

139    46     237  6.9

140    18     224 13.8

141    13      27 10.3

142    24     238 10.3

143    16     201  8.0

144    13     238 12.6

145    23      14  9.2

146    36     139 10.3

147     7      49 10.3

148    14      20 16.6

149    30     193  6.9

150    NA     145 13.2

151    14     191 14.3

152    18     131  8.0

153    20     223 11.5

【练习3】PPT-05第37页

案例1:求给定向量中的偶数个数

Num <- function(x){

  k=0

  stopifnot(is.numeric(x))

  for(i in x){

    if(i %% 2==0){

      k=k+1

    }

  }

  return(k)

}

Num(1:9)

【练习4】PPT-05第39页

案例1:自编函数计算标准差代码

BZC <- function(x){

  stopifnot(is.numeric(x))

  stopifnot(length(x)>1)

  avg<-mean(x)

  sum=0

  for(i in x){

    sum=sum+(i-avg)**2

  }

  return(sqrt(sum/length(x)))

}

BZC(c(1:5))

函数设计流程:

四:实验知识点总结

0:PPT-05上第29页中【na.rm=FALSE】的作用是——保留数据集中的缺失值,并尝试计算包含这些缺失值的统计量。当na.rm=TRUE时,函数会在计算统计量之前从数据集中删除所有的缺失值。

1:在变量的重命名中,rename函数可修改数据库和列表(不改变原数据集中的变量名),不能修改矩阵;names函数可修改数据库和列表(改变原数据集中的变量名),不能修改矩阵;colnames函数和rownames函数可修改矩阵和数据库的行名和列名。


2:数据排序函数的区别。

3:随机抽样函数的区别。

4:常用的数学函数。

5:常用的统计函数。

6:常用的高级数学函数。

 7:apply家族的使用方法。

8:函数体的组成部分。

五:遇到的问题和解决方法

问题&解决1:reshape2和reshape不是一个依赖包,只载入reshape包而不载入reshape2包,无法调用reshape2中的封装功能。因此,需要看清楚封装功能所来源的依赖包是哪一个,再进行调用。

问题&解决2:如果当前使用的镜像源太卡,会导致install.packages()失败。此时需要使用【chooseCRANmirror()】,并选择新的镜像源,然后再进行依赖包的安装和载入。或者通过例如【options(repos = c(CRAN = "https://cloud.r-project.org/"))】的方式更换。

问题&解决3:PPT中的思考题通过以下网页进行学习。

R语言数据框中的缺失值_na.rm=true什么意思-CSDN博客

https://www.cnblogs.com/chenwenyan/p/16384901.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1527115.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DockerFile遇到的坑

CMD 命令的坑 dockerfile 中的 CMD 命令在docker run -it 不会执行 CMD 命令。 FROM golang WORKDIR / COPY . ./All-in-one CMD ["/bin/sh","-c","touch /kkk.txt && ls -la"] RUN echo alias ll"ls -la" > ~/.bashrc(不…

Django 解析路由参数

编写带url参数的路由&#xff0c;4种类型参数 app1.url.py from django.urls import path from . import viewsurlpatterns [path(index, views.index, nameindex),path(test, views.test, nametest),path(test_int/<int:id>/, views.test_int, nametest_int),path(te…

多点位移计安装之灌浆步骤

在完成多点位移计的安装调整之后&#xff0c;接下来的步骤是通过回填沙浆来固结结构。使用灌浆设备&#xff0c;将砂浆从灌浆管注入钻孔中&#xff0c;注重从下至上的灌浆方法&#xff0c;确保孔内没有空隙形成。这个过程需要分步进行&#xff0c;同时逐步将灌浆管拉出。为了保…

部署Zabbix Agents添加使能监测服务器_Windows平台_MSI/Archive模式

Windows平台 一、从MSI安装Windows代理,添加Windows Servers/PC 概述 可以从Windows MSI安装包(32位或64位) 安装Zabbix agent 32位包不能安装在64位Windows中 所有软件包都支持TLS,配置TLS可选 支持UI和命令行的安装。 1、下载Agent代理程序,使用Agent2升级版,官网链接如…

mac os 配置两个github账号

1. 清空git全局配置的username和email git config --global --unset user.name git config --global --unset user.emailgit config --list 可以查看是否清空了 2. 定义两个标识符,这两个标识符以后会被用来代替“github.com”来使用。 假设两个账号的邮箱地址分别是a@gmai…

从底层结构开始学习FPGA(0)----FPGA的硬件架构层次(BEL Site Tile FSR SLR Device)

系列目录与传送门 《从底层结构开始学习FPGA》目录与传送门 Xilinx的FPGA&#xff0c;从硬件架构的角度可以划分为6个层次&#xff0c;从底层到顶层依次是&#xff1a; BEL&#xff08;最底层单元&#xff09;SiteTileFSRSLRDevice&#xff08;FPGA芯片&#xff09; 接下来我…

外贸网站文章批量生成器

随着全球贸易的不断发展&#xff0c;越来越多的企业开始关注外贸市场&#xff0c;而拥有高质量的内容是吸引潜在客户的关键之一。然而&#xff0c;为外贸网站生产大量优质的文章内容可能是一项耗时且繁琐的任务。因此&#xff0c;外贸网站文章批量生成软件成为了解决这一难题的…

Day 1.数据结构----单向链表(无头单向链表)

数据结构 如何组织存储数据 程序 数据结构 算法 MVC&#xff1a;软件设计结构 M&#xff1a;数据的管理&#xff08;数据结构&#xff09; V&#xff1a;视图&#xff0c;数据的反映及人机交互 C&#xff1a;逻辑控制 单向链表 有头链表&#xff1a;第一个链表结点中…

微信小程序选择器picker的使用(省市区)

index.wxml picker中的 moderegion模式&#xff0c;这里同element中的select不同的是&#xff0c;不需要自己在绑定数据原&#xff0c;默认就包含了省市区的整体数据 <view class"section"><view class"section__title">省市区选择器</vie…

LVS+Keepalived 高可用群集--部署

实际操作 LVS Keepalived 高可用群集 环境设备 LVS1192.168.6.88 &#xff08;MASTER&#xff09;LVS2192.168.6.87 &#xff08;BACKUP&#xff09;web1192.168.6.188web2192.168.6.189客户端192.168.6.86VIP192.168.6.180 &#xff08;一&#xff09;web服务器 首先配置…

prompt开发生命周期

1.定义任务场景和成功标准 任务场景可分为简单任务&#xff1a;实体抽取、qa等 复杂任务&#xff1a;代码生成、创意写作等 在定义任务后&#xff0c;就要定义模型实现该任务的成功标准&#xff1a; 模型表现和准确率&#xff1b;延迟&#xff1b;价格。 2.开发测试用例 多…

OkHttp

文章目录 OkHttp概要1.简介2.特点3.基本组成5.工作流程 拦截器1.简介2.内置拦截器3.自定义拦截器 连接池1.简介2.常用参数配置选项 Dispatcher和线程池1.简介2.重要方法3.DispatCher中的双端队列4.总结 OkHttp 概要 1.简介 OkHttp是一个开源的HTTP客户端&#xff0c;用于在J…

VSCode下使用github初步

由于各种需要&#xff0c;现在需要统一将一些代码提交搞github&#xff0c;于是有了在VSCode下使用github的需求。之前只是简单的使用git clone&#xff0c;代码提交这些用的是其他源代码工具&#xff0c;于是得学习实操下&#xff0c;并做一记录以备后用。 安装 VSCode安装 …

【ZooKeeper】1、基本介绍

本文基于 Apache ZooKeeper Release 3.7.0 版本书写 作于 2022年3月6日 14:22:11 转载请声明 1、Zookeeper是什么&#xff1f; 由ZooKeeper的官网介绍可知&#xff1a; ZooKeeper 是Apache原子基金会下一个开源的、用于提供可靠的分布式协同的服务器。 ZooKeeper 可以用来 配置…

【保姆级教程】YOLOv8_Pose多类别关键点检测,姿态识别:训练自己的数据集

Yolov8官方给出的是单类别的人体姿态关键点检测&#xff0c;本文将记录如果实现训练自己的多类别的关键点检测。 一、YOLOV8环境准备 1.1 下载安装最新的YOLOv8代码 仓库地址&#xff1a; https://github.com/ultralytics/ultralytics1.2 配置环境 pip install -r requiremen…

Python基于深度学习的中文情感分析系统,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

文心一言赋能问卷生成,打造高效问卷调研工具

当前&#xff0c;各种大语言模型&#xff08;LLM&#xff0c;Large Language Model&#xff09;井喷式发展&#xff0c;基于LLM的应用也不断涌现。但是&#xff0c;当开发者基于LLM开发下游应用时&#xff0c;LLM直接生成的结果在格式、内容等方面都存在许多不确定因素&#xf…

unity发布安卓获取读取权限

一、Player Settings 设置 Player Settings>Player>Other Settings> Android > Write Permission > External (SDCard). 二、代码 using System.Collections; using System.Collections.Generic; using System.IO; using UnityEngine; using UnityEngine.Andr…

【Unity】获取游戏对象或组件的常用方法

前言 在Unity开发过程中&#xff0c;我们经常需要获取组件&#xff0c;那么在Unity里如何获取组件呢&#xff1f; 一、获取游戏对象 1.GameObject.Find GameObject.Find 是通过物体的名称获取对象的 所以会遍历当前整个场景&#xff0c;效率较低 而且只能获取激活状态的物体…

GPT实战系列-LangChain的Prompt提示模版构建

GPT实战系列-LangChain的Prompt提示模版构建 LangChain GPT实战系列-LangChain如何构建基通义千问的多工具链 GPT实战系列-构建多参数的自定义LangChain工具 GPT实战系列-通过Basetool构建自定义LangChain工具方法 GPT实战系列-一种构建LangChain自定义Tool工具的简单方法…