我有一个由两列player1
和player2
一组n个玩家组成的数据集.每2个玩家互相玩两次(一次是我player1
和j player2
,一次是我player2
和j player1
)
我想分离我的数据,以便我有一个games1
数据框,其中包括所有游戏,这是两个玩家的第一个游戏和一个game2
包含所有第二个游戏的数据框(显然每个子数据帧是我原始数据帧的一半)
我已经考虑在所有行上使用for循环迭代并定义一个标志以确定它是否是两个玩家正在玩的第一个游戏.我只是想知道是否有更容易/更快的方式.
我有一个data.frame()
# reproducible exmaple
df1 <- read.table(text = "player1 player2
1: 1 2
2: 2 3
3: 3 2
4: 1 3
5: 2 1
6: 3 1", header = TRUE)
Run Code Online (Sandbox Code Playgroud)
我需要:
data.frame()
player1 player2
1: 1 2
2: 2 3
3: 1 3
Run Code Online (Sandbox Code Playgroud)
和
1: 3 2
2: 2 1
3: 3 1
Run Code Online (Sandbox Code Playgroud)
duplicated(...)
一个稍微丑陋的解决方案可以是按行排序,并通过和获取两个组duplicate(..., fromLast = TRUE)
,即
d1 <- data.frame(t(apply(df1, 1, function(i) sort(i, decreasing = TRUE))))
df1[!duplicated(d1),]
# player1 player2
#1: 1 2
#2: 2 3
#4: 1 3
#AND
df1[!duplicated(d1, fromLast = TRUE),]
# player1 player2
#3: 3 2
#5: 2 1
#6: 3 1
Run Code Online (Sandbox Code Playgroud)
由于不建议在全局环境中保留大量对象,因此可以将它们添加到列表中,即
list1 <- list(df1[!duplicated(d1),], df1[!duplicated(d1, fromLast = TRUE),])
Run Code Online (Sandbox Code Playgroud)