分类变量表示R中重复观察的指数

时间:2017-07-21 15:33:47

标签: r duplicates

我有以下数据框:

> data
v1 v2
1  1
1  1
3  2
4  4
4  4
4  4
6  5
7  6

我想创建一个分类变量,表示重复出现的次数。如果不重复观察,则变量将为1.如果观察结果出现两次,则第一次出现的变量为1,第二次出现的变量为2。因此,我想要一个返回以下数据框的变量:

> data_final
v1 v2 dup
1  1  1
1  1  2
3  2  1
4  4  1
4  4  2
4  4  3
6  5  1
7  6  1

我在R软件包中做了很多研究,但我找不到任何可以直接解决这个问题的方法。我正在使用非常大的数据集进行模拟,因此我希望找到一个计算成本不高的函数。任何帮助将不胜感激...谢谢!

2 个答案:

答案 0 :(得分:2)

您确定您的数据集属于matrix类,而不是data.frame吗? 如果它是一个df会使事情变得更容易,但第一个例子将是一个矩阵。但请注意,我只考虑第一列中的重复项。稍后会详细介绍。

result <- lapply(split(mat[, 1], mat[, 1]), seq_along)
result <- cbind(mat, unlist(result))
colnames(result) <- c(colnames(result)[1:2], "dup")
rownames(result) <- NULL
result
     v1 v2 dup
[1,]  1  1   1
[2,]  1  1   2
[3,]  3  2   1
[4,]  4  4   1
[5,]  4  4   2
[6,]  4  4   3
[7,]  6  5   1
[8,]  7  6   1

如果您有data.frame,名为mydf,则会更简单。

mydf$dup <- unlist(lapply(split(mydf, mydf[, 1]), function(x) seq_len(nrow(x))))
mydf
  v1 v2 dup
1  1  1   1
2  1  1   2
3  3  2   1
4  4  4   1
5  4  4   2
6  4  4   3
7  6  5   1
8  7  6   1

最后,如果您确实需要matrix,并希望获取两列的副本,请先将其转换为df mydf <- as.data.frame(matrix),然后使用上面的代码。然后使用as.matrix返回矩阵。

P.S。 matrix是矩阵的错误名称,因为它已经是R函数的名称。

答案 1 :(得分:1)

试试这个dplyr,我认为你要指定名称&#34;矩阵&#34;到data.frame

df%>%group_by(v1,v2)%>%dplyr::mutate(dup=row_number())


# A tibble: 8 x 3
# Groups:   v1, v2 [5]
     v1    v2   dup
  <int> <int> <int>
1     1     1     1
2     1     1     2
3     3     2     1
4     4     4     1
5     4     4     2
6     4     4     3
7     6     5     1
8     7     6     1