【发布时间】:2020-07-31 04:17:57
【问题描述】:
考虑以下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"
【问题讨论】:
-
ifelse(x=='A',x<-1,x)看起来很奇怪。你是说ifelse(x=='A',1,x)吗?同样,我认为您想要f2 = function(x) 'G' -
仅供参考,如果您尝试
class(apply(df, 1, f)),您会看到您的数据现在是"matrix",不再是"data.frame",因为apply所做的第一件事是convert its argument to a matrix . -
当您执行
ifelse(x=='A', x <- 1, x)时,您实际上是用1覆盖x来处理'A'的情况,然后返回新的x(1) 来处理所有非@ 987654350@ 个案例也是如此。ifelse(x=='A',1,x)如 Ben 的评论所示,将允许sapply(df, f)正常工作。 -
另外,我猜你只需要
df[df == 'A'] <- 1 -
@thelatemail,实际上......对于
'A'的情况,它不会用1 覆盖x,它只是用1(长度1)覆盖x。试试x <- 1:10 ; ifelse(x < 5, x <- 1, x); x。我从来没有认为ifelse的赋值inside 接近预期或期望的结果。