寻找R中独特元素的指数

时间:2014-06-09 15:06:12

标签: r list unique

今天大脑不能正常运作。我有一个数据框如下:

  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线程 - 非常相似 - 但仍然难倒。

提前致谢SO。

3 个答案:

答案 0 :(得分:4)

假设mydf是您的数据框,并且您可以尝试为您的rownames返回字符值,那么您可以尝试:

> 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

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

答案 1 :(得分:1)

通过组合拆分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

答案 2 :(得分:0)

这是使用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