LearningR-数据处理
Programming with select 存疑?? select_(iris_df,~Petal.Length) select_(iris_df,"Petal.Length") select_(iris_df,lazyeval::interp(~matches(x),x = ".t.")) select_(iris_df,quote(-Petal.Length),quote(-Petal.Width)) select_(iris_df,.dots = list(quote(-Petal.Length),quote(-Petal.Width))) 3.1.5 添加新变量mutate对已有列进行数据运算并添加为新列: mtcars_df <- tbl_df(mtcars) mutate(mtcars_df,displ_l = disp / 61.0237) #transmute结果只有计算的字段 transmute(mtcars_df,displ_l = disp / 61.0237) mutate_each() 对每一列运行窗体函数。 mutate_each(iris,funs(min_rank)) plyr::mutate() 与 base::transform() 相似,优势在于可以在同一语句中对刚增加的列进行操作。 mutate(hflights_df,gain = ArrDelay - DepDelay,gain_per_hour = gain / (AirTime / 60) ) #而同样操作用R自带函数 transform() 的话就会报错: transform(hflights,gain_per_hour = gain / (AirTime / 60) ) 通过data.frame有可以实现 mtcars_df <- data.frame(mtcars_df,displ_l = mtcars_df$disp / 61.0237) 3.1.6 汇总summarisesummarise(mtcars_df,mean(disp,na.rm = TRUE),n()) summarise(group_by(mtcars_df,cyl),mean(disp),m = mean(disp),sd = sd(disp)) #对每?一列运?行概述函数。 summarise_each(iris,funs(mean)) by_species <- iris %>% group_by(Species) by_species %>% summarise_each(funs(length)) by_species %>% summarise_each(funs(mean)) by_species %>% summarise_each(funs(mean),Petal.Width) by_species %>% summarise_each(funs(mean),matches("Width")) count() #计算各变量中每?一个特定值的?行数(带权重或不带权重)。 count(iris,wt = Sepal.Length) count(iris,mycount = n()) 3.1.7 tallymtcars %>% group_by(cyl,vs) %>% tally(sort = TRUE) #与下列方式相同 mtcars %>% group_by(cyl,vs) %>% summarise(n = n()) %>% arrange(cyl,vs,n) 3.2 分组group_by当对数据集通过 group_by() 添加了分组信息后,mutate(),arrange() 和 summarise() 函数会自动对这些 tbl 类数据执行分组操作 (R语言泛型函数的优势). summarise(mtcars_df,n(),n_distinct(gear)) summarise(group_by(mtcars_df,sd = sd(disp)) #a mutate/rename followed by a simple group_by group_by(mtcars_df,vsam = vs + am) group_by(mtcars_df,vs2 = vs) summarise(group_by(mtcars_df,cyl2=cyl),sd = sd(disp)) 另: 一些汇总时的小函数 n(): 计算个数 3.3 链式操作(管道) %>% 或 %.%dplyr包还新引进了一个操作符,读成then,使用时把数据名作为开头,然后依次对此数据进行多步操作。比如: mtcars %>% group_by(cyl) %>% summarise(total = sum(disp)) %>% arrange(desc(total)) %>% head(5) (x1-x2)^2%>%sum()%>%sqrt() 按数据处理的思路写代码,一步步深入,既易写又易读,接近于从左到右的自然语言顺序, 对比一下用R自带函数实现的. head(arrange(summarise(group_by(mtcars,total = sum(disp)),desc(total)),5) x1 <- 1:5 x2 <- 2:6 sqrt(sum((x1-x2)^2)) 或者像这篇文章所用的方法: totals <- aggregate(. ~ cyl,data=mtcars[,c("cyl","disp")],sum) ranks <- sort.list(-totals$disp) #ranks <- order(-totals$disp) totals[ranks[1:5],] 文章里还表示: 通过 %>% 那段代码比跑上面这段代码,运算速度提升很多倍. 至于这个新鲜的概念会不会和 ggplot2 里的 + 连接号一样,发挥出种种奇妙的功能呢? 还是在实际使用中多体验感受吧. 3.5 数据匹配合并join
x <- data.frame(name = c("John","Paul","George","Ringo","Stuart","Pete"),instrument = c("guitar","bass","guitar","drums","drums")) y <- data.frame(name = c("John","Brian"),band = c("TRUE","TRUE","FALSE")) inner_join(x,y) left_join(x,y) semi_join(x,y) anti_join(x,y) full_join(x,y) right_join(x,y) 3.6 连接数据库
3.7 利用窗体函数变换数据4. tidyrtidyr包的作者也是Hadley Wickham,与dplyr包结合使用,是reshape2包的替代。 5. 字符串处理5.1 字符个数 ncharnchar()能够获取字符串的长度,它和length()的结果是有区别的。 nchar(c("abc","abcd"))??? #求字符串中的字符个数,返回向量c(3,4) length(c("abc","abcd"))? #返回2,向量中元素的个数 5.2 连接字符 pastepaste()不仅可以连接多个字符串,还可以将对象自动转换为字符串再相连,另外它还能处理向量,所以功能更强大。 paste("fitbit",month,".jpg",sep="") paste("fitbit",1:12,sep = "") paste默认的分隔符是空格,必须指定sep=""。还有一个collapse参数,可以把这些字符串拼成一个长字符串,而不是放在一个向量中。 paste("fitbit",1:3,sep = "",collapse = "; ") (编辑:源码网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |