7

我有一个这样的数据框:

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

(Value 列只是为了说明每一行都是一个数据点;实际值并不重要。)最终,我想做的是根据 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 循环,跟踪每个中的行数并将迄今为止遇到的最大值分配给每一行。我一直在试图弄清楚,但我的矢量符很弱。

4

3 回答 3

5

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

 df$Index <- ave( 1:nrow(df), df$Dim1, factor( df$Dim2), FUN=function(x) 1:length(x) )

ave函数返回一个与其第一个参数长度相同但在由第一个参数和名为 的参数之间的所有因子定义的类别内计算的向量FUNunique() applies only to vectors(我经常忘记在我的函数中输入“FUN=”并收到一条类似于

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

ave( 1:nrow(df), df$Dim1, factor( df$Dim2), FUN=seq_along )
于 2013-04-18T20:20:21.210 回答
4

给你,使用data.table

library(data.table)
df <- data.table(
    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)
        )

df[, index := seq_len(.N), by = list(Dim1, Dim2)]
于 2013-04-18T20:26:36.907 回答
0

这是你想要达到的目标吗?

library(ggplot2)
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)
)
df$index <- c(1,2,3,4,1,2,1,1)

ggplot(df,aes(x=index,y=Value))+geom_point()+facet_wrap(Dim1~Dim2)

输出如下: 在此处输入图像描述

于 2013-04-18T20:27:07.970 回答