【问题标题】:new variable in data.table R based on multiple criteria基于多个标准的data.table R中的新变量
【发布时间】:2020-11-25 22:02:02
【问题描述】:

我有一个包含多个变量的所有世界杯球队的数据集,从 1930 年到 2006 年,如下所示:

    Year       Team ISO GF GA Penalties Matches SOG SW FK Offside Corners Won Drawn Lost
1: 1930  Argentina  AR 18  9         0       5  18  0  0       0       0   4     0    1
2: 1930    Uruguay  UY 15  3         0       4  15  0  0       0       0   4     0    0
3: 1930        USA  US  7  6         0       3   7  0  0       0       0   2     0    1
4: 1930 Yugoslavia  YU  7  7         0       3   7  0  0       0       0   2     0    1
5: 1930     Brazil  BR  5  2         0       2   5  0  0       0       0   1     0    1
6: 1930      Chile  CL  5  3         0       3   5  0  0       0       0   2     0    1

我想指出哪支球队是给定年份的获胜者,即创建一个新变量并将 1 分配给获胜者,将 0 分配给其他球队,如下所示:

    Year       Team ISO GF GA Penalties Matches SOG SW FK Offside Corners Won Drawn Lost Winner
1: 1930  Argentina  AR 18  9         0       5  18  0  0       0       0   4     0    1      0
2: 1930    Uruguay  UY 15  3         0       4  15  0  0       0       0   4     0    0      1
3: 1930        USA  US  7  6         0       3   7  0  0       0       0   2     0    1      0
4: 1930 Yugoslavia  YU  7  7         0       3   7  0  0       0       0   2     0    1      0
5: 1930     Brazil  BR  5  2         0       2   5  0  0       0       0   1     0    1      0
6: 1930      Chile  CL  5  3         0       3   5  0  0       0       0   2     0    1      0

我有一个按顺序排列获胜者的向量,我想这样做:

data[, Winner := ifelse(Team == c("Uruguay", "Italy", "Italy", "Uruguay", "Germany FR", "Brazil", "Brazil", "England", "Brazil", "Germany FR", "Argentina", "Italy", "Argentina", "Germany FR", "Brazil", "France", "Brazil", "Italy"), 1, 0), by = Year]

所以在 1930 年将 1 分配给乌拉圭,将 0 分配给其他球队,将 1 分配给意大利,在 1934 年将 0 分配给其他球队,依此类推……但这当然行不通,您能帮我实现我的目标吗?目标?

【问题讨论】:

  • 你的例子不清楚。你能用多个“年”和预期的输出展示一个更好的例子吗

标签: r if-statement data.table


【解决方案1】:

这里的问题似乎是这样的

  1. 我们正在使用 == 和另一个不同长度的向量
  2. 根据描述,我们可能需要匹配“年份”列对应的获胜者向量。

如果是这种情况,我们可以 replicate 获胜者姓名 ('team_vec') 的 vector 与每个“年份”的 length,然后执行 ==

library(data.table)
team_vec <-  c("Uruguay", "Italy", "Italy", "Uruguay",
  "Germany FR", "Brazil", "Brazil", "England", "Brazil", 
  "Germany FR", "Argentina", "Italy", "Argentina", "Germany FR", "Brazil", 
             "France", "Brazil", "Italy")


n1 <- data[, .(n = .N), Year]$n
data[, Winner := +(Team %in% rep(team_vec, n1))]

或者另一个选项是join,'key' 为'Year'。为此,我们可能需要创建一个keyvalue 数据集。如果需要,更改“年份”的值

keydat <- data.table(Year = seq(1930, 
     length.out = length(team_vec), by = 1), Team = team_vec)

然后加入

 data[, Winner := 0]
 data[keydat, Winner := 1, on = .(Team, Year)]
      

【讨论】:

  • 这个问题,它每年为向量中的所有团队分配 1,我想要的是在 1930 年仅将 1 分配给乌拉圭,仅在 1934 年分配给意大利,再次仅1938年到意大利等等。对不起,如果我不够清楚。
  • @john 有一个按“年”分组的分组
  • 是的,但由于某种原因,它仍然不会那样做。它在 1930 年也将 1 分配给阿根廷
  • 第一个解决方案给了我与以前相同的结果,第二个解决方案给了我这个错误: ColnamesInt(i, unname(on), check_dups = FALSE) 中的错误:参数指定列指定不存在的列(s): cols[2]='V2'
  • @john 抱歉,第二个有错字。在连接中应该是keydat。目前尚不清楚为什么第一个解决方案的输出相同。我replicated`基于“年”的频率的“team_vec”。因此,它对每个“年”进行元素比较
猜你喜欢
  • 2016-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-15
  • 2017-04-13
  • 1970-01-01
  • 2020-08-18
  • 2013-02-04
相关资源
最近更新 更多