R语言的知识点非常多,并且有许多功能和用法相似的函数,稍微不注意就容易混淆,直接的表现是在运行代码的时候不断报错,特别令人感到郁闷。但这类问题绝对不能抱着“差不多得了”的心态糊弄过去,必须花时间搞清楚,否则在未来往往是当初你抱着侥幸心理放过去的问题不断地给你挖坑。
在学习基本数据管理这部分内容的时候我就遇到了两个功能和用法非常相似的函数,我花费了大量的时间,查阅了许多资料才彻底搞清楚。
函数transform

作用:为原数据框添加新的列,可以改变原变量列的值,也可以赋值NULL删除列变量
用法:transform(‘data’, ...)
data就是要修改的数据,'...'代表要进行的修改
函数with/within

作用:修改原始数据(不仅限于数据框),添加新的列以及改变原变量列的值等
用法:with/within(data, expr, ...)
expr是指R语言的表达式,'...'代表要进行的修改
with函数的返回值是原语句的返回值。within跟with功能相同,但返回值不同,within会返回所有修改生效后的原始数据结构(列表、数据框等)。
下面通过一个简单的例子,说明transform函数与within函数的功能和用法。
假设需要创建一个名称为mydata 的数据框,其中的变量为向量x1和向量x2,现在创建一个新变量sumx存储向量x1和向量x2两个变量的和,并创建另外一个新变量meanx存储向量x1和向量x2两个变量的平均值。
首先,回顾一下数据框的概念。
数据框是R语言里中的一种数据结构,其内部可以由多种数据类型,每一列是一个变量,每行是一个观测记录。数据框是R语言中通用的数据结构,是一种特殊的列表对象。
然后,创建数据框mydata。
#创建数据框mydata,x1和x2是mydata的两个列向量
mydata <- data.frame(x1 = c(2, 2, 6, 4), x2 = c(3, 4, 2, 8))
根据上面提到的作用和用法,利用transform函数为数据框mydata增加数据。
#利用transform函数对数据框mydata增加两个变量(列向量)sumx和meanx,并把结果存储在数据框mydata中
mydata <- transform(mydata, sumx = x1 + x2, meanx = (x1 + x2)/2)利用within函数为数据框mydata增加数据,这时候我遇到了坑,代码如下
mydata <- within(mydata,sumx = x1 + x2, meanx = (x1 + x2)/2)报错!

又仔细看帮助文件,发现并书中within函数的例子并没有逗号,并且expr部分使用大括号{}
mydata <- within(mydata,{sumx = x1 + x2 meanx = (x1 + x2)/2})又报错!

没办法,通过Google查询了大量资料,花了好多时间看代码,我才注意在看到的所有资料的within函数代码中,从meanx全都换行了!所以,我认为需要尝试一下是否within函数同时进行多个修改,每个新修改的代码都需要换行。于是,我又一次修改了代码
mydata <- within(mydata, {sumx = x1 + x2
meanx = (x1 + x2)/2})运行代码,Bingo! 这次终于没有报错。我又查询了相关资料,发现还可以用“分号;”代替换行,代码如下
mydata <- within(mydata, {sumx = x1 + x2; meanx = (x1 + x2)/2})运行代码,正确!没有报错!
整理一下正确代码,如下
#创建数据框mydata,x1和x2是mydata的两个列向量
mydata <- data.frame(x1 = c(2, 2, 6, 4), x2 = c(3, 4, 2, 8))
#利用transform函数对数据框mydata增加两个变量(列向量)sumx和meanx,并把结果存储在数据框mydata中
mydata <- transform(mydata, sumx = x1 + x2, meanx = (x1 + x2)/2)
#利用within函数,expr表达式执行一条语句占一行,执行多条语句需要换行
mydata <- within(mydata, {sumx = x1 + x2
meanx = (x1 + x2)/2})
#或者多条语句在同一行,则中间应当用分号;隔开
mydata <- within(mydata, {sumx = x1 + x2; meanx = (x1 + x2)/2})
又查询了更多资料,总结全部要点如下:
transform函数只能用于数据框改变,而within函数应用更宽泛一些,可以用于除数据框之外的数据对象的改变。
R语言中expr表达式执行一条语句占一行,执行多条语句需要换行;如果需要多条语句在同一行,则中间应当用分号;隔开。
transform(数据框名, 对数据框的一系列修改),这些修改中间用逗号分隔,别换行。
within(数据框名, {修改1;修改2;修改3;......})或者within(数据框名,{修改1
修改2
修改3})
至此,全部问题都已经解决,并且全面理解了transform函数和with/within函数的用法,兴奋之情难以言表。
由此得到
1、Google是解决问题的利器,最好用且没有之一,说多少次都不过分。
2、自学且时间充裕的情况下,遇到不明白的问题尽量自己去解决,寻求他人帮助这一选项的优先级尽量往后放,自己解决的问题才能记忆深刻,才算真正的学会。
3、不要曲解第二点,在注重解决问题效率的前提下,效率怎么高怎么来,这时寻求帮助往往效率更高。
4、知识点和难点必须搞清楚,解决问题并且输出的同时能够带来自己各方面能力的提升,每天进步一点点。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31537575/viewspace-3137959/ ,如需转载,请注明出处,否则将追究法律责任。