我有一个非常大的数据框,其中包含整数列
以下是应该进行左连接的长数据的最小示例:
state
和state_cyclen
。每一行都是一个游戏帧,而state
描述了该帧中游戏所处的状态,state_cyclen
编码表示该状态发生的次数(基本上是data.table :: rleid(state)
)。在以state
为条件并按state_cyclen
进行循环的情况下,我需要从其他定义数据框导入几列。定义数据框存储关于状态的属性,它们的行顺序说明这些属性在整个游戏中如何循环(玩家多次遇到每个游戏状态)。以下是应该进行左连接的长数据的最小示例:
data <- data.frame(
state = c(1, 1, 2, 2, 3, 3, 1, 1, 2, 2, 3, 3, 2, 2, 3, 3, 3, 4, 4, 3, 3),
state_cyclen = c(1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 1, 1, 4, 4)
)
data
#> state state_cyclen
#> 1 1 1
#> 2 1 1
#> 3 2 1
#> 4 2 1
#> 5 3 1
#> 6 3 1
#> 7 1 2
#> 8 1 2
#> 9 2 2
#> 10 2 2
#> 11 3 2
#> 12 3 2
#> 13 2 3
#> 14 2 3
#> 15 3 3
#> 16 3 3
#> 17 3 3
#> 18 4 1
#> 19 4 1
#> 20 3 4
#> 21 3 4
定义存储排序的数据框的最小示例:
def_one <- data.frame(
prop = letters[1:3],
others = LETTERS[1:3]
)
def_two <- data.frame(
prop = letters[4:10],
others = LETTERS[4:10]
)
def_three <- data.frame(
prop = letters[11:12],
others = LETTERS[11:12]
)
我有一个基于R语言的解决方案可以得到所需的输出,但它既不易读,也可能不是很高效。
# Add empty columns
data$prop <- NA
data$others <- NA
# Function that recycles numeric vector bounded by a upper limit
bounded_vec_recyc <- function(vec, n) if(n == 1) vec else (vec - 1) %% n + 1
# My solution
vec_pos_one <- data[data[, "state"] == 1, ]$state_cyclen
vec_pos_one <- bounded_vec_recyc(vec_pos_one, n = nrow(def_one))
data[data[, "state"] == 1, ][, c("prop", "others")] <- def_one[vec_pos_one,]
vec_pos_two <- data[data[, "state"] == 2, ]$state_cyclen
vec_pos_two <- bounded_vec_recyc(vec_pos_two, n = nrow(def_two))
data[data[, "state"] == 2, ][, c("prop", "others")] <- def_two[vec_pos_two,]
vec_pos_three <- data[data[, "state"] == 3, ]$state_cyclen
vec_pos_three <- bounded_vec_recyc(vec_pos_three, n = nrow(def_three))
data[data[, "state"] == 3, ][, c("prop", "others")] <- def_three[vec_pos_three,]
data
#> state state_cyclen prop others
#> 1 1 1 a A
#> 2 1 1 a A
#> 3 2 1 d D
#> 4 2 1 d D
#> 5 3 1 k K
#> 6 3 1 k K
#> 7 1 2 b B
#> 8 1 2 b B
#> 9 2 2 e E
#> 10 2 2 e E
#> 11 3 2 l L
#> 12 3 2 l L
#> 13 2 3 f F
#> 14 2 3 f F
#> 15 3 3 k K
#> 16 3 3 k K
#> 17 3 3 k K
#> 18 4 1 <NA> <NA>
#> 19 4 1 <NA> <NA>
#> 20 3 4 l L
#> 21 3 4 l L
本文于2022-08-30使用reprex v2.0.2创建
TLDR:如您所见,我基本上是在按照对应的state
逐个合并这些定义数据框到主数据框中,通过循环利用定义数据框的行并保留它们的顺序,使用state_cyclen
列来跟踪每种状态在整个游戏过程中的出现次数。
是否有一种更快或至少更易读的方法在tidyverse
或data.table
中完成此操作?我需要这个方法运行得相当快,因为我有许多这样的游戏框架文件(数百个),而且它们很长(数十万行)。
P.S.不确定标题是否足够描述我正在进行的操作,因为我可以想象多种实现方式。欢迎编辑。
def_three
只有两行时,为什么第13行能找到 state:3 和 state_cyclen:3 的匹配项呢? - Jon Springwayback machine
,但您是否对[plotly 2, legend 1有任何看法?抱歉分心了。 - Chris