【问题标题】:How can I merge and maintain the row order of one input? [duplicate]如何合并和维护一个输入的行顺序? [复制]
【发布时间】:2012-06-24 01:33:38
【问题描述】:

我有一个将瓶号与其体积相关联的数据框(在下面的示例中为key)。我想编写一个函数,它将获取任何瓶号列表 (samp) 并返回瓶子体积列表同时保持samp中的瓶号顺序

下面的函数正确匹配瓶号和体积,但按瓶号升序对输出进行排序。

如何保持sampmerge 的顺序?设置 sort=FALSE 会导致“未指定的顺序”。

示例

samp <- c(9, 1, 4, 1)
num <- 1:10
vol <- sample(50:100, 10)
key <- data.frame(num, vol)
matchFun <- function(samp, key)
  {
    out <- merge(as.data.frame(samp), key, by.x="samp", by.y="num")
    return(out$vol)
  }

【问题讨论】:

  • 认真的吗?它在手册中。阅读?mergesort=TRUE 是默认值...
  • 由于某种原因,这似乎并没有保持samp 的原始顺序......
  • 好吧,我很抱歉。 sort=FALSE 以“未指定顺序”返回行。看起来我需要 RTFM。 ;-) 带来“伟大的评论”投票。我喜欢我的乌鸦干得好。
  • 感谢您的编辑!这是对我的问题的更清晰的描述。

标签: r sorting merge dataframe


【解决方案1】:

您可以使用 match 并通过结果对 key 进行子集化:

bottles <- key[match(samp, key$num),]
# rownames are odd because they must be unique, clean them up
rownames(bottles) <- seq(NROW(bottles))

【讨论】:

  • 约书亚,不应该是match(key$num, samp)吗?因为根据?match,结果的长度就是第一个参数的长度。最好使用%in% 语法来防止这种混淆:key[key$num %in% samp,]。另请注意,您只需分配 NULL 即可轻松重置行名,无需显式创建序列。
  • @Tomas:OP 想要一个长度为samp 的结果。 match(key$num, samp) 产生多个 NAkey[key$num %in% samp,] 缺少一行并且顺序错误。我同意你的rownames&lt;- 评论。
  • 约书亚,我必须承认我没有足够的精力来了解 OP 的特殊情况。让我感到困惑的是match(samp, key$num) 是长度为samp 而不是key 长度的TRUE/FALSE 向量,当您将它用于子集key 时,这有点奇怪,或者至少不寻常。如果这有效,那么只有在这种特殊情况下......
【解决方案2】:

plyr 包中的join 非常适合这个...

samp <- c(9, 1, 4, 1)
num <- 1:10
vol <- sample(50:100, 10)
key <- data.frame(num, vol)
samp<-as.data.frame(samp)
names(samp)<-"num"
library("plyr")
join(key,samp,type="right")

【讨论】:

    猜你喜欢
    • 2011-02-27
    • 2023-03-15
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-20
    • 2012-04-12
    相关资源
    最近更新 更多