创建list
adh <- list(chr="2L", start=14615555L, end=14618902L, name="Adh")
adh
[]
提取list中list,[[]]
从list中提取成分
> adh[1:2]
$chr
[1] "2L"
$start
[1] 14615555
#判断
> is.list(adh[1:2])
[1] TRUE
> is.character(adh[[1]])
[1] TRUE
#提取
> adh[[2]]
[1] 14615555
> adh[["start"]]
[1] 14615555
str()
用于查看复杂的数据结构。
> z <- list(a=list(rn1=rnorm(20), rn2=rnorm(20)), b=rnorm(10))
> str(z)
List of 2
$ a:List of 2
..$ rn1: num [1:20] 0.0723 0.1275 0.9433 -1.7768 -0.8932 ...
..$ rn2: num [1:20] 0.543 -0.411 1.3 -0.765 -1.074 ...
$ b: num [1:10] 0.321 0.445 -1.325 1.34 -0.7 ...
list由dataframe构建,每一个dataframe的列存储为向量作为list的成分。dataframe的语法也能用,如$
和<-
.
使用$
和<-
对list内的成分进行改变。
> adh$id <- "FBgn0000055"
> adh$chr <- "chr2L"
> adh
$chr
[1] "chr2L"
$start
[1] 14615555
$end
[1] 14618902
$name
[1] "Adh"
$id
[1] "FBgn0000055"
> adh$id <- NULL # remove the FlyBase ID
> adh
$chr
[1] "chr2L"
$start
[1] 14615555
$end
[1] 14618902
$name
[1] "Adh"
list的名称也可以使用names()
查询,或使用names(x) <-
进行改变。
lapply()
lapply()
,l是list,lapply
返回的结果是list.
#创建list
> ll <- list(a=rnorm(6, mean=1), b=rnorm(6, mean=4), c=rnorm(6, mean=6))
> ll
$a
[1] 0.05203000 0.01112254 -0.23893700 3.66401273 0.86951062
[6] 0.63504229
$b
[1] 4.906310 2.927300 5.341682 4.522183 4.704955 3.452957
$c
[1] 7.771889 8.441720 6.287369 5.530740 5.276436 5.859144
求list里面向量的均值。
- 循环版本
# create an empty numeric vector for the means
ll_means <- numeric(length(ll))
# loop over each list element and calculate mean
for (i in seq_along(ll)) {
ll_means[i] <- mean(ll[[i]])
}
- lapply()版本
> lapply(ll, mean)
$a
[1] 0.8321302
$b
[1] 4.309231
$c
[1] 6.527883
如果list中有某个值为NA,则整个list的计算值都返回为NA。
> ll$a[3] <- NA
> lapply(ll, mean)
$a
[1] NA
$b
[1] 4.309231
$c
[1] 6.527883
为了避免上述这种情况,需要设置na.rm=TRUE
> lapply(ll, mean, na.rm=TRUE)
$a
[1] 1.046344
$b
[1] 4.309231
$c
[1] 6.527883
当然最好是通过名字来进行内容的提取。
Writing functions
R中,写一条function
能覆盖另一条function
.
以计算均值为例。
> meanRemoveNA <- function(x) mean(x, na.rm=TRUE)
> lapply(ll, meanRemoveNA)
$a
[1] 1.046344
$b
[1] 4.309231
$c
[1] 6.527883
也可以将function()
写入lapply
.
> lapply(ll, function(x) mean(x, na.rm=TRUE))
$a
[1] 1.046344
$b
[1] 4.309231
$c
[1] 6.527883
写个判断语句,当碰到NA值时提示信息,并且删除NA值再进行计算。
> meanRemoveNAVerbose <- function(x, warn=TRUE) {
+ # A function that removes missing values when calculating the mean
+ # and warns us about it.
+ if (any(is.na(x)) && warn) {
+ warning("removing some missing values!")
+ }
+ mean(x, na.rm=TRUE)}
> lapply(ll,meanRemoveNAVerbose)
$a
[1] 1.046344
$b
[1] 4.309231
$c
[1] 6.527883
Warning message:
In FUN(X[[i]], ...) : removing some missing values!
即使我们在function()
里面给x赋予了另一个值,也不影响先前对x的赋值。
> x <- 3
> fun <- function(y){
+ x <- 2.3
+ x+y
+ }
> fun(x)
[1] 5.3
> x
[1] 3
sapply() and mapply()
sapply()
与lapply()
功能类似,不同的是sapply()
返回一个更精简的结果。
> sapply(ll, function(x) mean(x, na.rm=TRUE))
a b c
1.046344 4.309231 6.527883
mapply()
是sapply()
的多变量版本。传递给mapply()
的函数可以接收并使用多个参数.
查看两个list里面共有的allele的个数。
> ind_1 <- list(loci_1=c("T", "T"), loci_2=c("T", "G"), loci_3=c("C", "G"))
> ind_2 <- list(loci_1=c("A", "A"), loci_2=c("G", "G"), loci_3=c("C", "G"))
#intersect()查看共有元素
> mapply(function(a, b) length(intersect(a, b)), ind_1, ind_2)
loci_1 loci_2 loci_3
0 1 2
不像lapply()
和sapply()
,mapply()
的第一个参数是你想应用的函数。和sapply()
一样,mapply
尽可能去简化输出结果,通过设置SIMPLITY=F
来改变。
网友评论