【问题标题】:keep the order of the subsetting vector with data.table用 data.table 保持子集向量的顺序
【发布时间】:2019-12-03 01:48:58
【问题描述】:

我有一个简单的问题,但我想不出一个简单的解决方案:

library(data.table)
plouf <- data.table(1:10,letters[1:10])
plouf[V1 %in% c(3,1),V2]

[1] "a" "c"

我希望输出保持子集向量的初始顺序,即"c" "a"。有哪些可能性?

我有

sapply(c(3,1),function(x){plouf[V1 == x,V2]})

但我觉得它很丑。

编辑

我有

setkey(plouf,V1)
plouf[c(3,1),V2]

这无疑是 data.table 的好方法。 我仍然很好奇解决方案是什么

【问题讨论】:

  • 使用 match plouf[,V2[match(c(3, 1), V1)]]#[1] "c" "a"setkey 选项也会进行重新排序。如果您不希望这样,那么match 是一个选项

标签: r dataframe data.table subset


【解决方案1】:

这是match 的一个选项,可以在data.tablebase R 中使用。与%in%不同,match返回第一个匹配的位置索引,这可以用来获取另一列'V2'的对应元素

plouf[, V2[match(c(3, 1), V1)]]
#[1] "c" "a"

plouf[, match(c(3, 1), V1)] # returns numeric index
#[1] 3 1
plouf[, V1 %in% c(3, 1)] # returns logical vector
#[1]  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

因为%in%返回的是逻辑向量,所以当我们用它来提取元素时,每个TRUE值对应的元素都会被提取出来,即从第1和第3个位置提取,而不是从第3和第1个位置提取

【讨论】:

    【解决方案2】:

    使用data.table 键将完成您在此处的目标,此处的Keys and fast binary search based subset 小插图解释了用法。

    library(data.table)
    plouf <- data.table(1:10,letters[1:10])
    
    ## Set a key
    setkey(plouf,V1)
    ## Use .() syntax for key subsetting to get associated values of V2
    plouf[.(c(3,1)),V2]
    #[1] "c" "a"
    

    【讨论】:

    • 是的,我问了这个之后有点。感谢您的链接
    • 如果要保留数据的顺序,不需要设置key。只需使用 on= 参数进行临时连接/查找。 ?data.table 的详细信息部分提到了这一点,但显然还没有。
    • 哦,之前没注意,那是行号子集,不是键子集。你需要像.(c(3,1)) 或类似的包装。
    • 很好——我在原始答案中使用了.() 语法,但我自己却误以为它没有必要,并在随后的编辑中将其删除,现在将恢复。对于on ad-hoc 用法,您建议使用什么语法,我从未使用过该方法,并且阅读了我尝试过几种方法但均未成功的文档?
    • 可能类似于data.table(ID=LETTERS[1:10], VAL=1:10)[.(ID=c("C","A")), on=.(ID)]。见stackoverflow.com/a/20057411/1989480
    猜你喜欢
    • 2023-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 2016-12-04
    • 1970-01-01
    相关资源
    最近更新 更多