根据其他行/列组合中包含的信息创建新列

时间:2020-02-20 18:33:16

标签: r

我有一个带有匹配信息的数据框(团队,对手),以及该游戏在不同体育博彩中的下注分布。每个团队我都有一行,因此每场比赛都有两行。例如,请参见下面的数据框:

example <- data.frame(Team = c("Tennessee","Vanderbilt"),
                       Opponent = c("Vanderbilt","Tennessee"),
                       PointsBet = c(-13, 13),
                       DraftKings = c(-12.5, 12.5))

        Team   Opponent PointsBet DraftKings
1  Tennessee Vanderbilt       -13      -12.5
2 Vanderbilt  Tennessee        13       12.5

我要做的是创建“ Opponent_PointsBet”和“ Opponent_DraftKings”列。因此,对于每一行,我们不仅有团队的下注分布,而且还有对手的下注分布。在这样的小示例中,手动执行操作很容易,但是我的实际数据集包含数百行和大约25列其他列,我想复制其中的每一列。

是否可以为特定的“团队”获取一行数据,并将这些列作为该团队被标识为“对手”的数据行中的新列?我的输出看起来像这样:

        Team   Opponent PointsBet DraftKings Opp_PointsBet Opp_DraftKings
1  Tennessee Vanderbilt       -13      -12.5            13           12.5
2 Vanderbilt  Tennessee        13       12.5           -13          -12.5

还有一点要注意,我要复制的列并不总是相反的,所以我不能简单地将值乘以-1来获得Opp_列。

1 个答案:

答案 0 :(得分:1)

我们可以在base R中创建两列。创建一个位置索引以使“团队”与“对手”匹配,并使用该索引重新排列“ PointsBet”和“ DraftKings”中的列值以创建新列

nm1 <- names(example)[3:4]
i1 <-  with(example,match(Team, Opponent))
example[paste0("Opp_", nm1)] <- lapply(example[nm1], function(x) x[i1])
example
#       Team   Opponent PointsBet DraftKings Opp_PointsBet Opp_DraftKings
#1  Tennessee Vanderbilt       -13      -12.5            13           12.5
#2 Vanderbilt  Tennessee        13       12.5           -13          -12.5