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))
我有一个数据框,我需要在其中识别或索引每个新试验的开始。新试验由 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))