来自plyr :: aaply

时间:2017-02-28 09:24:00

标签: r plyr

我正在尝试对data.frame test进行排序,以便每行按字母顺序排列。

> test
        old     new
32  Aju.dec Cli.pol
151 Kob.pyg Fes.spp
57  Aju.dec Cli.pol
170 Kob.pyg Kob.cer

当然,这可以完成several ways

通过转置apply

的结果,我得到了预期的结果
t(apply(test, 1, sort))
    [,1]      [,2]     
32  "Aju.dec" "Cli.pol"
151 "Fes.spp" "Kob.pyg"
57  "Aju.dec" "Cli.pol"
170 "Kob.cer" "Kob.pyg"

但是plyr::aaply我得到一个数组

> plyr::aaply(test, 1, sort)
, ,  = old

         new
old       Cli.pol   Fes.spp   Kob.cer  
  Aju.dec "Aju.dec" NULL      NULL     
  Kob.pyg NULL      "Fes.spp" "Kob.cer"

, ,  = new

         new
old       Cli.pol   Fes.spp   Kob.cer  
  Aju.dec "Cli.pol" NULL      NULL     
  Kob.pyg NULL      "Kob.pyg" "Kob.pyg"

使用plyr::adply我得到未分类的data.frame返回

plyr::adply(test, 1, sort)
      old     new
1 Aju.dec Cli.pol
2 Kob.pyg Fes.spp
3 Aju.dec Cli.pol
4 Kob.pyg Kob.cer

我可以使用apply,但如果有人能解释我对plyr::aaplyplyr::adply的误解,我将不胜感激。如果有dplyr解决方案,我会更高兴。

数据

test <- structure(list(old = c("Aju.dec", "Kob.pyg", "Aju.dec", "Kob.pyg"
  ), new = c("Cli.pol", "Fes.spp", "Cli.pol", "Kob.cer")), .Names = c("old", 
  "new"), row.names = c(32L, 151L, 57L, 170L), class = "data.frame")

1 个答案:

答案 0 :(得分:1)

我感觉adply无法“分解”数据帧的结构 - 即它按预期执行功能,但它不能在两列之间移动观察。您可以将data.frame转换为矩阵,然后它就可以工作。

您的语法在其他方面是正确的可以通过例如将order或rank函数应用于data.frame。

adply(as.matrix(test), 1, sort)