r语言sample函数merge函数之后没有行名怎么设置

merge的使用方法
http://mcube./jokergoo/newblog/post/usage-of-merge/
周五 晚上 22:17
merge函数可以将两个数据框按照指定的方式连接在一起,如果把数据框看做数据库中的一张表时,merge的功能可以看作是对两个表join
使用方法:
merge(x, y, by = , by.x = , by.y = , all = , all.x = , all.y = ,
sort = , suffixes = , incomparables = , ...)
其中的参数解释如下
Description
连接的列名
intersect(names(x), names(y))
第一个数据框要连接的列名
第二个数据框要连接的列名
如果连接后没有这一行的记录,是否要包含此行
如果连接后第一个数据框中没有这一行的记录,是否要包含此行
如果连接后第二个数据框中没有这一行的记录,是否要包含此行
缺省下, merge等价于在两个表中的NATURAL JOIN,或者设置by的值使得merge等价于INNER
JOIN,也可以设置all的值来使得merge等价于OUTER
JOIN或者FULL,在缺省条件下,如果在两个数据框中没有相同的列名,则使用CROSS JOIN 比如有如下两个数据框
id_p firstname lastname
Adams Oxford Street
Fifth Avenue New York
Carter Changa Street
id_o orderno id_p
因为其中有同名的列名,使用merge而不指定要连接的列名
& merge(orders, persons)
id_p id_o orderno firstname lastname
Adams Oxford Street
Adams Oxford Street
Carter Changa Street Beijing
Carter Changa Street Beijing
这个如下的内连接相同
& merge(orders, persons, by="id_p")
& merge(orders, persons, by.x="id_p", by.y="id_p")
等价于如下的SQL语句
SELECT o.id_p,
o.orderno,
p.firstname,
p.lastname,
p.address,
FROM orders AS o
AND persons AS p
WHERE o.id_p = op.id_p
& merge(orders, persons, by.x = "id_p", by.y = "id_p", all.x = TRUE)
id_p id_o orderno firstname lastname
Adams Oxford Street
Adams Oxford Street
Carter Changa Street Beijing
Carter Changa Street Beijing
& merge(persons, orders, by.x = "id_p", by.y = "id_p", all.y = TRUE)
SELECT o.id_p,
o.orderno,
p.firstname,
p.lastname,
p.address,
FROM orders AS o
LEFT JOIN persons AS p
ON o.id_p = op.id_p
SELECT o.id_p,
o.orderno,
p.firstname,
p.lastname,
p.address,
FROM persons AS p
RIGHT JOIN orders AS o
ON o.id_p = op.id_p
& merge(orders, persons, by.x = "id_p", by.y = "id_p", all = TRUE)
id_p id_o orderno firstname lastname
Adams Oxford Street
Adams Oxford Street
Fifth Avenue New York
Carter Changa Street
Carter Changa Street
SELECT o.id_p,
o.orderno,
p.firstname,
p.lastname,
p.address,
FROM orders AS o
OUTER JOIN persons AS p
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。R语言经验:merge函数合并的两张表必须都有可以显式指定的匹配行 - 简书
下载简书移动应用
写了3808字,被18人关注,获得了6个喜欢
R语言经验:merge函数合并的两张表必须都有可以显式指定的匹配行
有一次,把前一张表的行名(row.name)设为匹配行,包括by.x=rownames(xx),或者是by.x=names(xx)(代码如下):
table.section &- merge(table.section, tableFinancial,
by.x=rownames(table.section), by.y="名称", all.x=FALSE)
table.section &- merge(table.section, tableFinancial,
by.x=names(table.section),, by.y="名称", all.x=FALSE)
怎么设置都无法合并,总是报错。
最后把行名提取出来,再加到第一张表里作为一列才匹配成功。
table.section &- cbind(rownames(table.section), table.section)
table.section &- merge(table.section, tableFinancial,
by.x="V1", by.y="营业部名称", all.x=FALSE)
匹配成功生成的新表当中,原有的行名全部被清除,第一张表的数据保留,加上第二张表除了匹配行之外的数据。
当merge里的参数all.x=TRUE时,两张表匹配不上的数据也保留在新表,但当all.x=FALSE时,两张表匹配不上的数据不出现在新表当中。merge得到的是一个data.frame.
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式:君,已阅读到文档的结尾了呢~~
R语言笔记笔记,R语言,R语言笔记,R 语言,死亡笔记r,笔记本r
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口数据的清理
由于我不是专业做数据清理的,所以我也不知道现实中的数据清洗最后要的结果是什么样的。但是如同列夫托尔斯泰所说的那样:“幸福的家庭都是相似的,不幸的家庭各有各的不幸”,糟糕的恶心的数据各有各的糟糕之处,好的数据集都是相似的。一份好的,干净而整洁的数据至少包括以下几个要素:
1、每一个观测变量构成一列
2、每一个观测对象构成一行
3、每一个类型的观测单元构成一个表
就像我们最常接触的鸢尾花数据:
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
每一列就是观测的指标:花瓣长度,花瓣宽度,萼片长度,萼片宽度,种类;每一行就是一株鸢尾花的观测值,构成整张表的元素就是四个数值变量,一个分类分类变量。
然而出于排版的考虑我们抓下来的数据往往不是那么的友好,比如说我们可以看到的数据通常是这样的:
religion &10k 10k-50k 50k-100k
## 1 Agnostic
## 2 Buddhist
## 3 Catholic
income freq
## 1 Agnostic
## 2 Agnostic
## 3 Agnostic 50k-100k
## 4 Buddhist
## 5 Buddhist
## 6 Buddhist 50k-100k
## 7 Catholic
## 8 Catholic
## 9 Catholic 50k-100k
当然,除了这种把列表每一列代表一些数值这种情况外,还有多个变量储存为一列(比如列表不仅以”&10k”,&#k”,&#0k”做表头,甚至还加上性别信息”m&10k”,&#k”,&#0k”,”f&10k”,&#k”,&#0k”,其中m代表男性,f代表女性),还有更过分的将列表的变量不仅储存在列中,行中也有统计变量。
面对这些不好的table,我们首先要做的就是数据管理,将数据整理为一个干净的数据集。
按照en:DAMA的定义:“数据资源管理,致力于发展处理企业数据生命周期的适当的建构、策略、实践和程序”。这是一个高层而包含广泛的定义,而并不一定直接涉及数据管理的具体操作(如关系数据库的技术层次上的管理)。我们这里主要讲述对于数据的变量命名与数据的合并,旨在方便数据共享。
数据管理首先要做的就是大致上了解你的数据,比如有什么样的变量,每一行大致长成什么样,最常用的就是head(),tail().
我们要做的基本上就是这么几项工作:
·给每一个变量命名,而不是V1,V2,如果有必要可以给出code book。
·每个变量名最好具有可读性,除非过长,否则不要用缩写,例如AgeAtDiagnosis这个命名远好于AgeDx。
·通常来说,最好将数据放在一张表里面,如果因为数据过多,项目过杂,分成了几张表。那么一定需要有一列使得这些表之间能够连接起来,但尽量避免这样做。
我们以UCI的 为例来看看数据是如何变成一个基本符合要求的数据。这个数据我们已经下载下来了,其中关于数据的详细信息可以参阅read me文档,由于UCI的数据通常都是一个基本合乎规范的数据集(主要是指它的数据集的变量名都是以V1,V2来命名的)加上一个code
book。那么我们看看各个数据的名称(在feature文件里)
setwd("F:/coursera/Data Science/peer assignment/get clean and tidy data/UCI HAR Dataset")name &- read.table("./features.txt", stringsAsFactors = F)
head(name)
1 tBodyAcc-mean()-X
2 tBodyAcc-mean()-Y
3 tBodyAcc-mean()-Z
tBodyAcc-std()-X
tBodyAcc-std()-Y
tBodyAcc-std()-Z
我们可以看到各个特征的名称直接标在数据上是非常不友善的,我们为了让他具有可读性,我们以展示在我们眼前的6个数据为例:
variablename &- head(name)# 将标签中的大写字母转为小写,我们这里没有所以不再赋值,如果需要全变为大写,可以使用toupper
tolower(variablename$V2)
## [1] "tbodyacc-mean()-x" "tbodyacc-mean()-y" "tbodyacc-mean()-z"
## [4] "tbodyacc-std()-x"
"tbodyacc-std()-y"
"tbodyacc-std()-z"
# 将变量名分离成3部分splitNames &- strsplit(variablename$V2, "-")splitNames[[1]]
## [1] "tBodyAcc" "mean()"
# 将变量名合成有意的名称named &- function(x) {
rr &- paste(x[2], x[1], "-", x[3], sep = "")
chartr("()", "of", rr)
sapply(splitNames, named)
## [1] "meanoftBodyAcc-X" "meanoftBodyAcc-Y" "meanoftBodyAcc-Z"
## [4] "stdoftBodyAcc-X"
"stdoftBodyAcc-Y"
"stdoftBodyAcc-Z"
用这样的名字给数据集命名就感觉舒服多了,我们将一些R中对字符串常用的操作函数总结如下,方便我们对数据名称的修改:
·sub:替换字符串中的第一个模式为设定模式(pattern).
·gsub:全局替换字符串中的相应模式
·grep,grepl:这两个函数返回向量水平的匹配结果,grep仅返回匹配项的下标,而grepl返回所有的查询结果,并用逻辑向量表示有没有找到匹配。
·nchar:统计字符串单字数目
·substr:取子串
·paste:将字符串链接起来,sep参数可以设置连接符
·str_trim:去掉字符串空格
变量的名称建议满足如下要求:
·英文变量名尽可能用小写
·尽可能的描述清楚变量特征 (Diagnosis versus Dx)
·不要太复杂
·不要有下划线、点、空格
字符型变量应该满足:
·是因子类型的应该转化为factor
·因子尽可能具有一定的描述性 (例如:如果0/1表示真假,那么用TRUE/FALSE代替0/1;在表示性别时用Male/Female代替M/F)
·Useful link:
接下来我们讨论数据集的合并,主要使用函数merge。
我们以下面两个数据集的合并为例:
df1 &- data.frame(id = sample(1:10), reviewer_id = sample(5:14), time_left = sample(1321:1330),
x = rnorm(10))df2 &- data.frame(id = sample(1:10), answer = rep("B", 10), time_left = sample(321:330),
y = rnorm(10))
head(df1, n = 3)
id reviewer_id time_left
head(df2, n = 3)
id answer time_left
329 0.8180
327 1.4639
323 0.8141
merge函数调用格式为:
merge(x, y, by = intersect(names(x), names(y)),
by.x = by, by.y = by, all = FALSE, all.x = all, all.y = all,
sort = TRUE, suffixes = c(".x",".y"),
incomparables = NULL, ...)
参数说明:
·x,y:两个数据框
·by, by.x, by.y:指定用于合并的列的名称。
·all,all.x,all.y:默认的all = FALSE相当于自然连接, 或者说是内部链接. all.x = TRUE是一个左连接, all.y = TRUE是一个又连接, all = TRUE 相当于一个外部链接.
仔细观察下面3个例子你就会发现其中的奥秘:
mergedData &- merge(df1,df2,by.x="reviewer_id",by.y="id",all=TRUE)
head(mergedData)
reviewer_id id time_left.x
x answer time_left.y
330 -0.7706
325 -0.4851
328 -1.1717
321 -0.4009
mergedData &- merge(df1,df2,by.x="id",by.y="id",all=TRUE)
head(mergedData)
id reviewer_id time_left.x
x answer time_left.y
330 -0.7706
325 -0.4851
328 -1.1717
321 -0.4009
mergedData2 &- merge(df1,df2,all=TRUE)
head(mergedData2)
id time_left reviewer_id
在plyr包中还提供了join,join_all,arrange等函数来实现表的连接,但我想merge这个函数已经足够用了,所以我们不在多说。当然,在极少数特别好的情况下(比如列的变量是一致的,或者行的观测个体是一致的时候)rbind,cbind也是有用的。
有些时候我们会遇到一些特殊的字符串:日期。R中提供了各式各样的函数来处理时间:
Sys.setlocale("LC_TIME", "C")
## [1] "C"
x &- c("1jan1960", "2jan1960", "31mar1960", "30jul1960")z &- as.Date(x, "%d%b%Y")
format(z, "%a %b %d")
## [1] "Fri Jan 01" "Sat Jan 02" "Thu Mar 31" "Sat Jul 30"
weekdays(z)
## [1] "Friday"
"Saturday" "Thursday" "Saturday"
## [1] - -
## attr(,"origin")
transform(z, weekend = as.POSIXlt(z, format = "%Y/%m/%d")$wday %in% c(0, 6))
X_data weekend
数据操作与整合
说到数据操作,这也是一个十分宽泛的话题,在这里我们就以下4个方面进行介绍:
·数据的筛选,过滤:根据一些特定条件选出或者删除一些观测
·数据的变换:增加或者修改变量
·数据的汇总:分组计算数据的和或者均值
·数据的排序:改变观测的排列顺序
然而在进行这一切之前首先要做的就是了解你的数据,我们以世界银行的数据为例,来一步步演示如何进行数据操作:
if (!file.exists("C:/Users/yujun/Documents/MDG_Data.csv")) {
download.file("http://databank.worldbank.org/data/download/MDG_csv.zip","F:/MDG.zip")
unzip("F:/MDG.zip")
}MDstats&-read.csv("C:/Users/yujun/Documents/MDG_Data.csv")
首先先来看一部分数据:
head(MDstats)
Country.Name Country.Code
Afghanistan
Afghanistan
Afghanistan
Afghanistan
Afghanistan
Afghanistan
Indicator.Name
Adolescent fertility rate (births per 1,000 women ages 15-19)
Agricultural support estimate (% of GDP)
AIDS estimated deaths (UNAIDS estimates)
Annual freshwater withdrawals, total (% of internal resources)
## 5 Antiretroviral therapy coverage (% of people with advanced HIV infection)
ARI treatment (% of children under 5 taken to a health provider)
Indicator.Code X X X X1996
SP.ADO.TFRT 167.5 168.1 168.7
169 169.3 169.5 169.8 170.06 166.1
## 2 NY.AGR.SUBS.GD.ZS
SH.DYN.AIDS.DH 100.0 100.0 100.0
100 100.0 100.0 100.0 100.00 100.0
ER.H2O.FWTL.ZS
SH.HIV.ARTC.ZS
SH.STA.ARIC.ZS
## 1 162.2 158.3 154.4 150.50 143.9 137.3 130.7 124.1 117.47 111.3 105.2
## 3 100.0 100.0 200.0 200.00 200.0 200.0 200.0 200.0 200.00 200.0 500.0
## 3 500.0 500.00 500.00
tail(MDstats)
Country.Name Country.Code
Indicator.Name
Tuberculosis treatment success rate (% of registered cases)
Unmet need for contraception (% of married women ages 15-49)
## 33095 Use of insecticide-treated bed nets (% of under-5 population)
Vulnerable employment, female (% of female employment)
Vulnerable employment, male (% of male employment)
Vulnerable employment, total (% of total employment)
Indicator.Code X X X X
SH.TBS.CURE.ZS
SP.UWT.TFRT
SH.MLR.NETS.ZS
## 33096 SL.EMP.VULN.FE.ZS
## 33097 SL.EMP.VULN.MA.ZS
SL.EMP.VULN.ZS
X X X X X X2008
我们显然发现了这不是一个tidy data,那么我们先将其变换为我们喜欢的tidy data,之后再看看数据摘要及数据集各单元的属性:
countryname countrycode
## 1 Afghanistan
## 2 Afghanistan
## 3 Afghanistan
## 4 Afghanistan
## 5 Afghanistan
## 6 Afghanistan
indicatorname
Adolescent fertility rate (births per 1,000 women ages 15-19)
Agricultural support estimate (% of GDP)
AIDS estimated deaths (UNAIDS estimates)
Annual freshwater withdrawals, total (% of internal resources)
## 5 Antiretroviral therapy coverage (% of people with advanced HIV infection)
ARI treatment (% of children under 5 taken to a health provider)
indicatorcode
year value
SP.ADO.TFRT X
## 2 NY.AGR.SUBS.GD.ZS X1990
SH.DYN.AIDS.DH X
ER.H2O.FWTL.ZS X1990
SH.HIV.ARTC.ZS X1990
SH.STA.ARIC.ZS X1990
summary(MDstatsMelt)
countryname
countrycode
Afghanistan
American Samoa:
(Other):775056
indicatorname
Adolescent fertility rate (births per 1,000 women ages 15-19)
Agricultural support estimate (% of GDP)
AIDS estimated deaths (UNAIDS estimates)
Annual freshwater withdrawals, total (% of internal resources)
Antiretroviral therapy coverage (% of people with advanced HIV infection):
ARI treatment (% of children under 5 taken to a health provider)
indicatorcode
AG.LND.FRST.K2
:-9.43e+08
AG.LND.FRST.ZS
1st Qu.: 1.10e+01
Median : 5.10e+01
: 2.26e+10
DC.ODA.SOCL.CD
3rd Qu.: 9.80e+01
DC.ODA.SOCL.ZS
: 7.53e+13
(Other):595764
str(MDstatsMelt)
## 'data.frame':
794352 obs. of
6 variables:
$ countryname
: Factor w/ 247 levels "Afghanistan",..: 1 1 1 1 1 1 1 1 1 1 ...
$ countrycode
: Factor w/ 247 levels "ABW","ADO","AFG",..: 3 3 3 3 3 3 3 3 3 3 ...
$ indicatorname: Factor w/ 134 levels "Adolescent fertility rate (births per 1,000 women ages 15-19)",..: 1 2 3 4 5 6 7 8 9 10 ...
$ indicatorcode: Factor w/ 134 levels "AG.LND.FRST.K2",..: 120 39 64 30 72 82 129 130 131 132 ...
: Factor w/ 24 levels "X1990","X1991",..: 1 1 1 1 1 1 1 1 1 1 ...
168 NA 100 NA NA ...
我们可以看看各个数值数据的分位数:
quantile(MDstatsMelt$value,na.rm=TRUE)
## -9.431e+08
看看各个国家的统计数据有多少:
table(MDstatsMelt$countrycode)
## 16 16 16 16 16
## 16 16 16 16 16
## 16 16 16 16 16
## 16 16 16 16 16
## 16 16 16 16 16
## 16 16 16 16 16
## 16 16 16 16 16
## 16 16 16 16 16
## 16 16 16 16 16
## 16 16 16 16 16
## 16 16 16 16 16
## 16 16 16 16 16
## 16 16 16 16 16
## 16 16 16 16 16
## 16 16 16 16 16
## 16 16 16 16 16
## 16 16 3216
看看缺失值:
sum(is.na(MDstatsMelt$value))
#总的缺失值
## [1] 495519
colSums(is.na(MDstatsMelt))
#每一列的缺失值
countryname
countrycode indicatorname indicatorcode
# 如果我们用回tidy前的数据集,那么这个函数会显得比较有用
colSums(is.na(MDstats))
Country.Name
Country.Code Indicator.Name Indicator.Code
# 等价的处理方式stat &- function(x) {
sum(is.na(x))
tapply(MDstatsMelt$value, MDstatsMelt$year, stat)
## X X X X X X
## X X X X X X
统计某个国家的统计数据占总统计数目的多少
table(MDstatsMelt$countryname %in% c("China"))
prop &- table(MDstatsMelt$countryname %in% c("China"))[2]/sum(table(MDstatsMelt$countryname %in% c("China")))prop
## 0.004049
看看数据集的大小:
object.size(MDstatsMelt)
print(object.size(MDstatsMelt),units="Mb")
## 21.3 Mb
至此,我们可以说我们对数据有了一定的了解。另外值得一提的是,对于某些特定的数据,也许xtabs,ftable是有用的。
数据的筛选
要提取相应内容的数据,最为常用的就是提取相应元素,比如提取某个元素,提取某一行,某一列。我们通过下面下面的例子来学习:
data&-data.frame(a=sample(1:10),b=rep(c("a","b"),each=5),cdf=rnorm(10))data
7 a -0.4635
5 b -1.5338
8 b -1.3566
#提取相应元素data[2,1]
data[[1]][[2]]
data[[c(1,2)]]
#提取某一列data[[3]]
data[["c"]]
data[["c", exact = FALSE]]
数据的筛选还有一个最为常用的的就是移除缺失值:
data&-data.frame(a=c(sample(1:5),NA,NA,sample(6:10)),b=c(rep(c("a","b"),each=5),NA,NA),cdf=rnorm(12))data
a -0.276400
a -1.861240
a -2.028003
a -0.348072
b -1.220922
b -0.133295
b -0.596801
## 11 10 &NA&
good &- complete.cases(data)data[good, ]
5 a -0.2764
1 a -1.8612
3 a -2.0280
4 a -0.3481
9 b -0.1333
7 b -0.5968
bad &- as.data.frame(is.na(data))data[!(bad$a|bad$b|bad$c),]
5 a -0.2764
1 a -1.8612
3 a -2.0280
4 a -0.3481
9 b -0.1333
7 b -0.5968
数据筛选有时是为了获得符合条件的数据:
X &- data.frame("var1"=sample(1:5),"var2"=sample(6:10),"var3"=sample(11:15))X &- X[sample(1:5),]; X$var2[c(1,3)] = NAX
var1 var2 var3
X[(X$var1 &= 3 & X$var3 & 11),]
var1 var2 var3
subset(X,(X$var1 &= 3 & X$var3 & 11))
var1 var2 var3
X[(X$var1 &= 3 | X$var3 & 15),]
var1 var2 var3
X[which(X$var1 &= 3 | X$var3 & 15),]
var1 var2 var3
对于取子集的函数subset,在帮助文档中有一段warning是值得我们注意的:“This is a convenience
function intended for use interactively. For programming it is better to use
the standard subsetting functions like [, and in particular the non-standard
evaluation of argument subset can have unanticipated consequences.”
数据的变换
常见的数据变换函数有:
·abs(x) 绝对值
·sqrt(x) 开根号
·ceiling(x) 求上线,例:ceiling(3.475) = 4
·floor(x) 求下线,例:floor(3.475) = 3
·round(x,digits=n) 四舍五入,例:round(3.475,digits=2) = 3.48
·signif(x,digits=n) 四舍五入,例:signif(3.475,digits=2) = 3.5
·cos(x), sin(x) etc.三角变换
·log(x) 对数变换
·log2(x), log10(x) 以2、10为底的对数变换
·exp(x) 指数变换
除此以外,我们还经常对数据加标签,以期在回归中测量其效应。我们以MASS包的shuttle数据集为例,想知道不同类型的风(wind)是否需要使用不同的装载机(use),这里我们希望将head wind标记为1,auto
use也记为1,我们可以按照如下办法设置虚拟变量:
library(MASS)
data(shuttle)
head(shuttle)
stability error sign wind
pp head Medium
pp head Strong
pp tail Medium
pp tail Strong
## Make our own variables just for illustrationshuttle$auto &- 1 * (shuttle$use == "auto")shuttle$headwind &- 1 * (shuttle$wind == "head")
head(shuttle)
stability error sign wind
use auto headwind
pp head Medium
pp head Strong
pp tail Medium
pp tail Strong
当然对于因子类型变量,relevel函数在线性模型的分析中也是能取得等价效果的。
有些时候,我们还常常将连续数据离散化,这时我们需要用到函数cut:
data &- rnorm(1000)
table(cut(data, breaks = quantile(data)))
(-3.28,-0.637] (-0.637,0.0321]
(0.672,3.37]
library(Hmisc)
table(cut2(data, g = 4))
## [-3.2) [-0.4) [ 0.9) [ 0.4]
detach("package:Hmisc", unload = TRUE)
获得分组区间后,我们只需要将区间的因子重命名就成功的实现了数据的离散化。
数据的汇总
对数据进行汇总,分类汇总是我们也比较常用的,比如对行或列求和,求均值,求分位数:
data &- matrix(1:16, 4, 4)data
[,1] [,2] [,3] [,4]
apply(data, 2, mean)
6.5 10.5 14.5
apply(data, 1, sum)
## [1] 28 32 36 40
apply(data, 1, quantile, probs = c(0.25, 0.75))
[,1] [,2] [,3] [,4]
apply(data, 2, quantile, probs = c(0.25, 0.75))
## 25% 1.75 5.75
9.75 13.75
## 75% 3.25 7.25 11.25 15.25
有时候,为了更快些,我们会用一些函数替代apply:
·rowSums = apply(x, 1, sum)
·rowMeans = apply(x, 1,mean)
·colSums = apply(x, 2, sum)
·colMeans = apply(x, 2,mean)
我们有时也会处理一些列表,对列表的分类汇总我们会用到sapply,lapply,不同的是前者返回一个向量或矩阵,后者返回一个列表,例:
x &- list(a = 1:10, beta = exp(-3:3), logic = c(TRUE,FALSE,FALSE,TRUE))
lapply(x, mean)
## [1] 5.5
## [1] 4.535
## [1] 0.5
sapply(x, mean)
beta logic
## 5.500 4.535 0.500
# median and quartiles for each list element
lapply(x, quantile, probs = 1:3/4)
## 3.25 5.50 7.75
## 0.0 5.0537
## 25% 50% 75%
## 0.0 0.5 1.0
sapply(x, quantile)
beta logic
## 100% 10.00 20.08554
有时候我们还会进行分类汇总,如统计男女工资均值,这时你可以用tapply:
group &- (rbinom(32, n = 20, prob = 0.4))groups &- factor(rep(1:2,10))
tapply(group, groups, length)
tapply(group, groups, sum)
## 135 122
tapply(group, groups, mean)
## 13.5 12.2
数据的排序
数据的排序需要用到的函数常见的有sort和order,其中sort返回排序的结果,order返回对应数据的排名。例:
X &- data.frame("var1"=sample(1:5),"var2"=sample(6:10),"var3"=sample(11:15))X &- X[sample(1:5),]X$var2[c(1,3)] &- NA
sort(X$var2,decreasing=TRUE)
## [1] 9 8 6
sort(X$var2,decreasing=TRUE,na.last=TRUE)
order(X$var2,decreasing=TRUE)
## [1] 2 5 4 1 3
order(X$var2,decreasing=TRUE,na.last=TRUE)
## [1] 2 5 4 1 3
X[order(X$var2),]
var1 var2 var3
#deal with the linkX$var2[c(1)] &- sample(na.omit(X$var2),1)X[order(X$var2,X$var3),]
var1 var2 var3
有些时候,更为强大的aggregate函数是我们需要的,我们以R的内置数据集state.x77为例:
aggregate(state.x77,
list(Region = state.region,
Cold = state.x77[,"Frost"] & 130),
Cold Population Income Illiteracy Life Exp Murder HS Grad
Northeast FALSE
South FALSE
69.71 10.581
## 3 North Central FALSE
West FALSE
## 6 North Central
## 1 110.60
## 3 120.00
## 5 160.50
## 6 157.67
## 7 161.83 184162
当然,这里还有一个更为基本与灵活的函数,split,可以帮助你将数据分为若干张满足分类条件的表,你可以一张一张的处理它们:
library(datasets)
head(airquality)
Ozone Solar.R Wind Temp Month Day
s &- split(airquality, airquality$Month)
lapply(s, function(x) colMeans(x[, c("Ozone", "Solar.R", "Wind")]))
Ozone Solar.R
Ozone Solar.R
Ozone Solar.R
NA 216.484
Ozone Solar.R
Ozone Solar.R
Useful link:
·Hadley Wickham:
·Phil Spector:
·coursera material:
您也可以使用第三方帐号快捷登录
订单信息(价格单位:积分)
*商品名称:
*商品单价:
*商品数量:
收货信息商店(虚拟商品除邮箱外可不填)
收货姓名:
收货地址:
收货邮编:
用户邮箱:
电话号码:
手机号码:
留言备注:
总金额:1.00 积分

我要回帖

更多关于 r语言 自定义函数 的文章

 

随机推荐