美文网首页R语言
[R语言]使用(l,s,m)apply对list数据进行操作

[R语言]使用(l,s,m)apply对list数据进行操作

作者: 巩翔宇Ibrahimovic | 来源:发表于2020-02-21 17:26 被阅读0次

创建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来改变。

相关文章

网友评论

    本文标题:[R语言]使用(l,s,m)apply对list数据进行操作

    本文链接:https://www.haomeiwen.com/subject/oyxhqhtx.html