gpt4 book ai didi

r - 如何根据因素组合向数据框添加行索引

转载 作者:行者123 更新时间:2023-12-04 14:14:39 26 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Numbering rows within groups in a data frame

(9 个回答)


3年前关闭。




我有一个这样的数据框:

df <- data.frame(
Dim1 = c("A","A","A","A","A","A","B","B"),
Dim2 = c(100,100,100,100,200,200,100,200),
Value = sample(1:10, 8)
)

Dim1 Dim2 Value
1 A 100 3
2 A 100 6
3 A 100 7
4 A 100 4
5 A 200 8
6 A 200 9
7 B 100 2
8 B 200 10

(值列只是为了说明每一行都是一个数据点;实际值并不重要。)
最终我想要做的是在 Dim1 和 Dim2 定义的子集中根据它们的索引绘制值。出于这个原因,我认为需要附加一个包含索引的新列,它看起来像这样(在行之间添加空行以明确子集是什么):
  Dim1 Dim2 Value Index
1 A 100 1 1
2 A 100 9 2
3 A 100 4 3
4 A 100 10 4

5 A 200 7 1
6 A 200 3 2

7 B 100 5 1

8 B 200 8 1

我如何在 R 中优雅地做到这一点?我来自 Python,我的默认方法是对 Dim1 和 Dim2 的组合进行 for 循环,跟踪每行中的行数并将迄今为止遇到的最大值分配给每行。我一直在想办法解决这个问题,但我的 vector-fu 很弱。

最佳答案

这可能看起来像作弊,因为我将一个向量传递给一个函数,然后我完全忽略了它,除了获取它的长度:

 df$Index <- ave( 1:nrow(df), df$Dim1, factor( df$Dim2), FUN=function(x) 1:length(x) )
ave函数返回一个与它的第一个参数长度相同的向量,但在由第一个参数和名为 FUN 的参数之间的所有因子定义的类别内计算。 . (我经常忘记为我的函数添加“FUN=”并得到一条与 unique() applies only to vectors 类似的神秘错误消息,因为它试图确定匿名函数拥有多少个唯一值但失败了。

实际上还有另一种更紧凑的表达方式 function(x) 1:length(x)使用 seq_along函数可能更安全,因为如果传递长度为零的向量它会正确失败,而匿名函数形式将通过返回 1:0 错误地失败。而不是 numeric(0) :
ave( 1:nrow(df), df$Dim1, factor( df$Dim2), FUN=seq_along )

关于r - 如何根据因素组合向数据框添加行索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16092239/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com