lunaticsun

Design, Data & A Story

4997e540-3ffe-11e1-b513-782bcb32ff27

factor分类与显示 R语言

我们对数据进行分类统计时便要用到 factor 数据。一般 factor 类型的数据在数据库中都会以整数存储以节省数据库空间,这样就需要解决 factor 的分类和显示问题。假设有一个公司部门的数据 x,1代表行政部,2代表财务部,3代表销售部,我们如果只要对1和2做分类统计的话,可以使用以下方法。

new_x <- factor(x, levels=c(1, 2))

对于这样的操作,所有原来是3的数据都会被处理为 NA。假设我们还想把1和2显示成字符串。

new_x <- factor(x, levels=c(1, 2), labels=c("行政部", "财务部"))

labels 这个参数根据 levels 中的排序,依次将整数替换成字符串,方便显示。

1202a7a0-3c11-11e1-b9e4-782bcb3825eb

数字vector分区间统计 R语言

除了按照字符型类别去统计数据时,我们往往还需要按照数字区间进行分类统计。假设我们要按照一家公司员工的入职天数进行分类,统计不同区间的人数时,就要用到分区间的技巧。分区间一般使用 cut 函数。

f <- cut(days, breaks=c(0, 100, 200))

以上函数将入职天数 days 按照 breaks 参数设定的数字值,将 days 分为两大类,(0, 100] 和 (100, 200]。注意,默认区间最左侧值不包含,右侧值包含。如果想要包含最小值 0 ,采用如下写法。

f <- cut(days, breaks=c(0, 100, 200), include.lowest=T)

cut 函数将返回一个 factor 类型数据,即可以对这类数据进行分类统计。如

tapply(!is.na(days), f, sum)

将分别计算入职天数在 [0, 100]和(100, 200]的人数。

359e9920-3b59-11e1-a75b-782bcb383994

去除当前环境所有变量 R语言

使用 rm 函数能够删除当前环境中不需要的变量,假设有一个变量 x,我们不再需要它,那么可以使用

rm(x)
rm("x")

假设我们有一个 character vector,需要将其中名称的变量都删除,那么可以使用

rm(list=c("x", "y", "z"))

极端的情况可以使用 ls() 或 objects() 函数返回当前环境中所有变量名称的 character vector。于是就有

rm(list=ls())

即删除所有当前环境变量。这个技巧可以用在代码开始用来防止意外的命名冲突。

6fd22980-3a7e-11e1-a25a-782bcb383994

&与&&操作符的区别 R语言

假设有一个 vector 

x <- c(1,2,3,4,5,6,7,8,9)

要找出既大于2,又小于5的部分,那么首先要做个双条件的逻辑判断。这个判断应该是

x>2 & x<5 #FALSE FALSE TRUE TRUE FALSE FALSE FALSE FALSE FALSE

其中 TRUE 和 FALSE 的判断分别根据两个条件产生的 logical vector 做 & 操作获得。

x[x>2 & x<5] #得到值 3 4 

注意不要使用 &&,因为 && 操作符仅用于长度为1的 vector,因此它只会返回 vector 中第一项的比较结果,即 FALSE。

2ddc9ce0-39a7-11e1-9bc6-782bcb38253b

[]与[[]]操作符的区别 R语言

对于不同的数据类型,[ ] 操作和 [[ ]] 操作的意义是不同的。对于一个 array 数据(如 tapply 返回的数据为 array 类型),假设我们使用 datasets 包中的默认数据 beaver1。

x <- tapply(beaver1$temp, beaver1$activ, mean)

返回的 x 是一个 array 类型的数据,如果用 x[1],那么将同样返回一个 array 类型的数据,该数据是 x 的第一列,是一个子集。如果用 x[[1]],那么将返回 array 数据中的第一个数据,而不是一个子集。

同样的当 x 的数据类型是 list 时,[]操作将返回一个 list 数据类型,且将是 x 的一个子集。如果使用 [[]] 操作,将返回 list 中的一个数据,该数据类型由本身确定,和 list 无关。对于 data.frame 数据也是如此。

但对于 table 和 matrix 数据类型来说,[] 与 [[]] 操作返回的数据类型均不是子集,而是数据本身

59325b30-385a-11e1-a25a-782bcb383994

拆解字符串并逐个处理 R语言

有一个字符串 vector "1,234,567", "1,234", "234", "2,234" 。如果想把逗号去掉我们可以将这个字符串拆解,使用 strsplit 函数。

sv <- c("1,234,567", "1,234", "234", "2,234")
svl <- strsplit(sv, split=",")

sv1此时返回的是一个 list 数据,list 中的每一项都变成了 sv 中每一项的一个字符串 vector。

[[1]]
[1] "1" "234" "567"
[[2]]
[1] "1" "234"
[[3]]
[1] "234"
[[4]]
[1] "2" "234"

因此要处理 strsplit 返回的数据就要用到 lapply。

svl2 <- lapply(svl, paste, collapse="")

对于 svl 中的每一项进行字符串合并,即 paste(collapse="") 。最后我要把 list 数据重新合并为一个字符串 vector,要用到 c。

c(svl2, recursive=T)

必须使用 recursive=T 这个参数去合并。得到的结果就是

c("1234567", "1234", "234", "2234")
5c958440-3766-11e1-9203-782bcb38253b

筛选dataframe行 R语言

使用 logical vector 筛选

当我们拿到一个 dataframe 数据时,往往需要筛选出一些行,比如我们要把所有含有 NA 数据的行去除掉。这时我们可以使用一个简单的操作。如

data <- data[ <logical>, ]

其中 <logical> 是一个 logical vector,他和 data 具有同样的长度,当对应的值为 FALSE 时,则会去除这一行,为 TRUE 则保留该行。看个例子

data <- data[complete.cases(data), ]

complete.cases(data) 这个函数返回一个和 data 行数一样长度的 vector,判断 data 中的每一行的数据中是否有 NA,只要有一个 NA 就返回 FALSE。通过这个函数我们把 data 的每一行中只要有一个 NA 的话,就把这一行从 data 中删除了。

logical vector 还可以是 data$name %in% somenames

使用 number vector 筛选

data <- data[c(1, 2), ]

其中 c(1, 2) 代表行数,即仅返回第1、第2行。如果要返回除去第1、第2的行则使用

data <- data[-c(1, 2), ]

当筛选的 number vector 和 which 函数一起使用时,效果和 logical vector 类似。