【问题标题】:Finding Indices of Unique Elements in R在 R 中查找唯一元素的索引
【发布时间】:2014-06-09 15:06:11
【问题描述】:

今天脑子不好。我有一个数据框如下:

  V1   V2
1  8  200
2  8  200
3  8  200
4  8  200
5 34  250
6  8 2500

我想返回一个列表,列表中的每个元素都包含一个向量,该向量包含我的数据框中每对唯一元素的索引。该列表应如下所示:

[[1]]
[1] 1 2 3 4

[[2]]
[1] 5

[[3]]
[1] 6

我引用了 this 线程 - 非常相似 - 但仍然难以理解。

提前致谢。

【问题讨论】:

    标签: r list unique


    【解决方案1】:

    假设 mydf 是您的数据框,并且您可以接受为行名返回的字符值,您可以尝试:

    > lapply(split(mydf, list(mydf$V1, mydf$V2), drop=TRUE), row.names)
    $`8.200`
    [1] "1" "2" "3" "4"
    
    $`34.250`
    [1] "5"
    
    $`8.2500`
    [1] "6"
    

    否则就有点啰嗦了:

    > lapply(split(mydf, list(mydf$V1, mydf$V2), drop=TRUE),
             function(x) as.numeric(row.names(x)))
    $`8.200`
    [1] 1 2 3 4
    
    $`34.250`
    [1] 5
    
    $`8.2500`
    [1] 6
    

    注意:当然,如果您的行名与原始数据框中的行号不对应,则不能将它们用作提取索引。

    【讨论】:

    • 几乎与我即将发布 +1 的答案完全相同!
    • 虽然它们可能出现在此示例中,但请注意 row.names 并不总是数字。通常最好将它们保留为角色,因为您也可以轻松地以这种方式进行子集化。索引和 row.names 可以完全不同。
    【解决方案2】:

    通过组合拆分 2 列:

    split(seq_len(nrow(dat)),paste(dat$V1,dat$V2,sep='/'))
    
    $`34/250`
    [1] 5
    
    $`8/200`
    [1] 1 2 3 4
    
    $`8/2500`
    [1] 6
    

    【讨论】:

    • +1 你也可以这样做:split(seq_len(nrow(dat)),list(dat$V1,dat$V2), drop=TRUE)
    • +1 巧妙地使用了drop=TRUE。我不知道这个!
    【解决方案3】:

    这是一个使用tapplyinteraction 的选项,假设您的data.frame 被命名为dd

    with(dd, tapply(seq.int(nrow(dd)), interaction(V1, V2, drop=T), 
        identity, simplify=F))
    
    # $`8.200`
    # [1] 1 2 3 4
    # 
    # $`34.250`
    # [1] 5
    # 
    # $`8.2500`
    # [1] 6
    

    【讨论】:

      猜你喜欢
      • 2019-11-11
      • 1970-01-01
      • 1970-01-01
      • 2017-04-15
      • 1970-01-01
      • 2016-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多