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