在 R 中应用和应用行为
Sapply and apply behaviour in R
考虑以下 df
:
structure(list(GID7173723 = c("A", "T", "G", "A", "G"), GID4878677 = c("G",
"C", "G", "A", "G"), GID88208 = c("A", "T", "G", "A", "G"), GID346403 = c("A",
"T", "G", "A", "G"), GID268825 = c("G", "C", "G", "A", "G")), row.names = c(NA,
5L), class = "data.frame")
看起来像这样:
GID7173723 GID4878677 GID88208 GID346403 GID268825
1 A G A A G
2 T C T T C
3 G G G G G
4 A A A A A
5 G G G G G
以及以下函数:
f = function(x){
ifelse(x=='A',x<-1,x)
}
使用 apply
一切如我所料运行良好:
apply(df, 1,f)
1 2 3 4 5
GID7173723 "1" "T" "G" "1" "G"
GID4878677 "1" "C" "G" "1" "G"
GID88208 "1" "T" "G" "1" "G"
GID346403 "1" "T" "G" "1" "G"
GID268825 "1" "C" "G" "1" "G"
但是如果我使用 sapply
或 lapply
所有值都转换为 1:
> sapply(dfn,f)
GID7173723 GID4878677 GID88208 GID346403 GID268825
[1,] 1 1 1 1 1
[2,] 1 1 1 1 1
[3,] 1 1 1 1 1
[4,] 1 1 1 1 1
[5,] 1 1 1 1 1
我从文档中了解到 lapply
和 sapply
将 FUN
应用于每个元素。为什么所有内容都转换为 1?与 R 将整数强制转换为字符串有什么关系吗?请帮忙。
我不明白的另一个方面是为什么使用这个新函数我只有一个包含 5 个元素的 vector
而不是一个充满 'G' 的 dataframe
:
f2 = function(x) x<-'G'
> sapply(dfn,f2)
GID7173723 GID4878677 GID88208 GID346403 GID268825
"G" "G" "G" "G" "G"
> apply(dfn, 1,f2)
1 2 3 4 5
"G" "G" "G" "G" "G"
- apply以df或矩阵作为输入,输出=>向量、列表、数组
- lapply将df、list或vector作为输入,输出=>list
- sapply以df、列表或向量为输入,输出=>向量或矩阵
第一个问题。如果你使用
apply(df, 2,f)
你还会得到一个 table 全是 1。 R 没有将字符串转换为整数。
第二题。试试这个,因为 1 用于行,2 用于列。
apply(df, 2,f2)
考虑以下 df
:
structure(list(GID7173723 = c("A", "T", "G", "A", "G"), GID4878677 = c("G",
"C", "G", "A", "G"), GID88208 = c("A", "T", "G", "A", "G"), GID346403 = c("A",
"T", "G", "A", "G"), GID268825 = c("G", "C", "G", "A", "G")), row.names = c(NA,
5L), class = "data.frame")
看起来像这样:
GID7173723 GID4878677 GID88208 GID346403 GID268825
1 A G A A G
2 T C T T C
3 G G G G G
4 A A A A A
5 G G G G G
以及以下函数:
f = function(x){
ifelse(x=='A',x<-1,x)
}
使用 apply
一切如我所料运行良好:
apply(df, 1,f)
1 2 3 4 5
GID7173723 "1" "T" "G" "1" "G"
GID4878677 "1" "C" "G" "1" "G"
GID88208 "1" "T" "G" "1" "G"
GID346403 "1" "T" "G" "1" "G"
GID268825 "1" "C" "G" "1" "G"
但是如果我使用 sapply
或 lapply
所有值都转换为 1:
> sapply(dfn,f)
GID7173723 GID4878677 GID88208 GID346403 GID268825
[1,] 1 1 1 1 1
[2,] 1 1 1 1 1
[3,] 1 1 1 1 1
[4,] 1 1 1 1 1
[5,] 1 1 1 1 1
我从文档中了解到 lapply
和 sapply
将 FUN
应用于每个元素。为什么所有内容都转换为 1?与 R 将整数强制转换为字符串有什么关系吗?请帮忙。
我不明白的另一个方面是为什么使用这个新函数我只有一个包含 5 个元素的 vector
而不是一个充满 'G' 的 dataframe
:
f2 = function(x) x<-'G'
> sapply(dfn,f2)
GID7173723 GID4878677 GID88208 GID346403 GID268825
"G" "G" "G" "G" "G"
> apply(dfn, 1,f2)
1 2 3 4 5
"G" "G" "G" "G" "G"
- apply以df或矩阵作为输入,输出=>向量、列表、数组
- lapply将df、list或vector作为输入,输出=>list
- sapply以df、列表或向量为输入,输出=>向量或矩阵
第一个问题。如果你使用
apply(df, 2,f)
你还会得到一个 table 全是 1。 R 没有将字符串转换为整数。
第二题。试试这个,因为 1 用于行,2 用于列。
apply(df, 2,f2)