加入收藏 | 设为首页 | 会员中心 | 我要投稿 威海站长网 (https://www.0631zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

LearningR-数据处理

发布时间:2021-03-14 22:18:21 所属栏目:大数据 来源:网络整理
导读:R自带函数 reshape2 data restructuring dplyr data aggregation tidyr 待整理 字符串处理 1. R自带函数 1.1 转置 使用函数t()可对一个矩阵或数据框进行转置,对于数据框,行名将变成变量(列)名。 cars - mtcars(1:5,1:4)carst(cars) 数列array进行维度转

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 汇总summarise

summarise(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 tally

mtcars %>%
    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(): 计算个数
n_distinct(x): 计算 x 中唯一值的个数

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

  • inner_join(x,y) :只包含同时出现在x,y表中的行

  • left_join(x,y) :包含所有x中以及y中匹配的行

  • semi_join(x,y) :包含x中,在y中有匹配的行,结果为x的子集

  • anti_join(x,y) :包含x中,不匹配y的行,结果为x的子集,与semi_join相反

  • full_join(x,y) :包含所以x、y中的行

  • right_join(x,y) :包含所有y中以及x中匹配的行

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 连接数据库

  • dplyr 可以连接数据库

  • 使用与本地数据框操作一样的语法

  • 只支持生成SELECT语句

  • 支持SQLite,PostgreSQL/Redshift,MySQL/MariaDB,BigQuery,MonetDB

3.7 利用窗体函数变换数据

4. tidyr

tidyr包的作者也是Hadley Wickham,与dplyr包结合使用,是reshape2包的替代。
(先挖坑...)

5. 字符串处理

5.1 字符个数 nchar

nchar()能够获取字符串的长度,它和length()的结果是有区别的。

nchar(c("abc","abcd"))??? #求字符串中的字符个数,返回向量c(3,4)
length(c("abc","abcd"))? #返回2,向量中元素的个数

5.2 连接字符 paste

paste()不仅可以连接多个字符串,还可以将对象自动转换为字符串再相连,另外它还能处理向量,所以功能更强大。

paste("fitbit",month,".jpg",sep="")
paste("fitbit",1:12,sep = "")

paste默认的分隔符是空格,必须指定sep=""。还有一个collapse参数,可以把这些字符串拼成一个长字符串,而不是放在一个向量中。

paste("fitbit",1:3,sep = "",collapse = "; ")

(编辑:威海站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读