R 函数用于识别前几行中的唯一行,而不是完全在数据框中

R function to identify unique rows from previous rows, not within the dataframe altogether

我有一个数据框,我需要在其中识别或索引每个新试验的开始。新试验由 0-8 的变量 Location 指示。示例如下:

    zPos        Location
    1.9148150   6
    1.914815    6
    1.914815    6
    1.914815    6
    1.914815    6
    0.9018518   3
    0.9018518   3
    0.9009259   3
    0.9009259   3
    0.9009259   3
    0.9009259   3

每个数据帧中有 72 次试验,因此每个位置值重复 8 次,这意味着唯一性无效。我是 R 的新手,所以我没有在 base R 和 dplyr 之外尝试太多来解决这个问题。

理想情况下,我想为试用编号创建一个新变量,示例如下:

    zPos        Location       TrialNum
    1.9148150   6              1
    1.914815    6              1
    1.914815    6              1
    1.914815    6              1
    1.914815    6              1
    0.9018518   3              2
    0.9018518   3              2
    0.9009259   3              2
    0.9009259   3              2
    0.9009259   3              2
    0.9009259   3              2

但我也可以使用每个新试验的起始位置索引,而不是数据框中的新变量。

这是我关于 Whosebug 的第一个问题,非常感谢任何帮助或见解。

您可以使用 rle 来执行此操作。

df <- data.frame(
  zPos = c(1.9148150, 1.914815, 1.914815, 1.914815, 1.914815, 0.9018518,
           0.9018518, 0.9009259, 0.9009259, 0.9009259, 0.9009259),
  Location = c(6, 6, 6, 6, 6, 3, 3, 3, 3, 3, 3)
)

get_trial <- function(col) {
  r <- rle(col)
  rep(seq(length(r$lengths)), r$lengths)
}

df %>%
  mutate(TrialNum = get_trial(Location))

        zPos Location TrialNum
1  1.9148150        6        1
2  1.9148150        6        1
3  1.9148150        6        1
4  1.9148150        6        1
5  1.9148150        6        1
6  0.9018518        3        2
7  0.9018518        3        2
8  0.9009259        3        2
9  0.9009259        3        2
10 0.9009259        3        2
11 0.9009259        3        2

这可行:

df$iTrialNum <- match(df$Location, unique(df$Location)) 

# -------------------------------------------------------------------------
#     zPos Location iTrialNum
# 1  1.9148150        6         1
# 2  1.9148150        6         1
# 3  1.9148150        6         1
# 4  1.9148150        6         1
# 5  1.9148150        6         1
# 6  0.9018518        3         2
# 7  0.9018518        3         2
# 8  0.9009259        3         2
# 9  0.9009259        3         2
# 10 0.9009259        3         2
# 11 0.9009259        3         2

示例数据 (df)

dput(df)
structure(list(zPos = c(1.914815, 1.914815, 1.914815, 1.914815, 
1.914815, 0.9018518, 0.9018518, 0.9009259, 0.9009259, 0.9009259, 
0.9009259), Location = c(6L, 6L, 6L, 6L, 6L, 3L, 3L, 3L, 3L, 
3L, 3L)), class = "data.frame", row.names = c(NA, -11L))