【问题标题】:Sapply and apply behaviour in R在 R 中应用和应用行为
【发布时间】: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"

但如果我使用sapplylapply,所有值都会转换为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

我从文档中了解到lapplysapplyFUN 应用于每个元素。为什么一切都被转换为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&lt;-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 &lt;- 1, x) 时,您实际上是用1 覆盖x 来处理'A' 的情况,然后返回新的x (1) 来处理所有非@ 987654350@ 个案例也是如此。 ifelse(x=='A',1,x) 如 Ben 的评论所示,将允许 sapply(df, f) 正常工作。
  • 另外,我猜你只需要df[df == 'A'] &lt;- 1
  • @thelatemail,实际上......对于'A' 的情况,它不会用1 覆盖x,它只是用1(长度1)覆盖x。试试x &lt;- 1:10 ; ifelse(x &lt; 5, x &lt;- 1, x); x。我从来没有认为ifelse 的赋值inside 接近预期或期望的结果。

标签: r apply lapply


【解决方案1】:
  • apply 将 df 或矩阵作为输入,输出=>向量、列表、数组
  • lapply 将 df、list 或 vector 作为输入,输出=> list
  • sapply 将 df、列表或向量作为输入,输出=> 向量或矩阵

第一个问题。如果你使用

apply(df, 2,f)

你还会得到一张满是 1 的桌子。 R 没有将字符串转换为整数。

第二个问题。试试这个,因为 1 用于行,2 用于列。

apply(df, 2,f2)

【讨论】:

  • 在您的列表中,添加 sapply 除了向量、矩阵或数组之外,还可以返回 list
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-29
  • 1970-01-01
相关资源
最近更新 更多