【发布时间】:2020-08-17 04:50:49
【问题描述】:
假设我有一个大的data.table,它看起来像下面的dt。
dt <- data.table(
player_1 = c("a", "b", "b", "c"),
player_1_age = c(10, 20, 20, 30),
player_2 = c("b", "a", "c", "a"),
player_2_age = c(20, 10, 30, 10)
)
# dt
# player_1 player_1_age player_2 player_2_age
# 1: a 10 b 20
# 2: b 20 a 10
# 3: b 20 c 30
# 4: c 30 a 10
从上面的dt,我想创建一个data.table,其中包含独特的球员和他们的年龄,如下所示,player_dt:
# player_dt
# player age
# a 10
# b 20
# c 30
为此,我尝试了下面的代码,但在我的较大数据集上花费的时间太长,可能是因为我正在为 sapply 的每次迭代创建一个 data.table。
您如何获得上面的player_dt,同时检查每个player 是否只有一个唯一的age 值?
# get unique players
player <- sort(unique(c(dt$player_1, dt$player_2)))
# for each player, get their age, if there is only one age value
age <- sapply(player, function(x) {
unique_values <- unique(c(
dt[player_1 == x][["player_1_age"]],
dt[player_2 == x][["player_2_age"]]))
if(length(unique_values) > 1) stop() else return(unique_values)
})
# combine to create the player_dt
player_dt <- data.table(player, age)
【问题讨论】:
-
您可能正在寻找某种形式的更长时间的支点
-
如果有
b = 15代表player_2或单个d = 5代表其他玩家,你能显示预期的输出吗? -
谢谢@markus!如果
b = 15或d = 5,我希望函数停止,这样我可以更正更大数据集中的错误。在更大的数据集中,每个玩家应该只匹配一个年龄值。基本上,我想找到一种方法来识别此类错误。您是否认为我应该分两步执行此操作,(1)识别更大数据集中的错误;然后 (2) 创建唯一的玩家数据,player_dt? -
@user12256545 您能否详细说明枢轴“更长”是什么意思?
-
Pivot longer 是赋予 pivot 或 unpivot(SQL 术语)或 melt 或 cast(重塑术语)的一些新名称。
标签: r data.table