科学实验原始数据格式多种多样,这给数据处理分析带来困难。如果有一个统一的数据格式,可以降低数据的复杂性,便于理解和交流,也给统计程序开发者提供方便,增加数据逻辑的使用范围。庆幸的是,科学数据都可以转化为字段和记录两向列表的形式。这个两向表遵循以下三条规则:
tidyverse是用于数据整理的R包。 安装:install.packages('tidyverse') 或者安装其轻量版本 install.packages("tidyr") 如想使用最新版本,可以从源码安装: install.packages("devtools") devtools::install_github("tidyverse/tidyr")
使用: library('tidyr')
filter(flights, month == 1, day == 1) 比较运算符:>, >=, <, <=, != (不等于), and == (等于). 注意,等于是==而不是=,前者是比较运算符,后者是赋值运算符,这一点容易出错。
另外需要注意的是在使用==比较浮点数时,计算机提供的有限精度的近似而不是绝对精确的数值(物质的有限可分性原理)
sqrt(2) ^ 2 其实并不等于2,测试一下:
sqrt(2) ^ 2
#> [1] FALSE
1/49 * 49 == 1
#> [1] FALSE
这时不要使用==,代之以near()函数:
near(sqrt(2) ^ 2, 2)
#> [1] TRUE
near(1 / 49 * 49, 1)
#> [1] TRUE
逻辑运算符:|、& 、!、xor filter(flights, month == 11 | month == 12)
arrange(flights, year, month, desc(day))
rename(flights, tail_num = tailnum)
mutate(突变,变异),如病毒变异、DNA突变。 mutate从现有变量产生新的变量,并加到现有变量的后面。
flights_sml <- select(flights,
year:day,
ends_with("delay"),
distance,
air_time
)
mutate(flights_sml,
gain = arr_delay - dep_delay,
speed = distance / air_time * 60
)
如果只需要新的变量,而不包括原有变量,使用transmute
transmute(flights,
gain = arr_delay - dep_delay,
hours = air_time / 60,
gain_per_hour = gain / hours
)
运算符:%/% 整除, %% 求余, +, -, *, /, sum(), log(), log2(), log10(() , lead(), tag()
summarise(flights, delay = mean(dep_delay, na.rm = TRUE))
summarize()与group_by()配合使用。
by_day <- group_by(flights, year, month, day)
summarise(by_day, delay = mean(dep_delay, na.rm = TRUE))
对于一系列的操作,组成一个操作序列的情况,前一个操作的结果作为后一个操作的参数。这时可以通过管道来组织代码,使得整个流程更加清晰,代码的可读性也会提高。数据作为参数在函数中流动,与物体在管道中的流动模型十分相似,因此这种组合的处理方式叫做管道,管道符号为%>%,前一个函数的输出结果,作为后一个函数的第一个参数输入并且书写是省略参数名,而默认为第一个参数。如,x %>% f(y) 变成 f(x, y), 而x %>% f(y) %>% g(z) 变成 g(f(x, y), z)。
delays <- flights %>%
group_by(dest) %>%
summarise(
count = n(),
dist = mean(distance, na.rm = TRUE),
delay = mean(arr_delay, na.rm = TRUE)
) %>%
filter(count > 20, dest != "HNL")
这样处理流程更清晰,代码更整洁了。
平均值和中位数
not_cancelled %>%
group_by(year, month, day) %>%
summarise(
avg_delay1 = mean(arr_delay),
avg_delay2 = mean(arr_delay[arr_delay > 0]) # the average positive delay
)
not_cancelled %>%
group_by(dest) %>%
summarise(distance_sd = sd(distance)) %>%
arrange(desc(distance_sd))
not_cancelled %>%
group_by(year, month, day) %>%
summarise(
first = min(dep_time),
last = max(dep_time)
)
not_cancelled %>%
group_by(year, month, day) %>%
summarise(
first_dep = first(dep_time),
last_dep = last(dep_time)
)
n()函数返回当前组的大小,即当前组包含的记录数。 sum(!is.na(x))返回非空记录数,n_distinct(x)返回非重复记录数。
not_cancelled %>%
group_by(dest) %>%
summarise(carriers = n_distinct(carrier)) %>%
arrange(desc(carriers))
计数
not_cancelled %>%
count(dest)
加权计数:
not_cancelled %>%
count(tailnum, wt = distance)
sum(x > 10), 当x为数值型,TRUE转化为1,FALSE转化为0,然后计算总和,这实际上是对满足该条件的记录数。mean(y == 0)则返回满足该条件的记录占总记录数的比例。
daily <- group_by(flights, year, month, day)