我有一个data.frame有一个因子和两个字符串字符列(国籍)。该因子有2662个级别,每个级别表示一个团队。团队有多个成员,因此每个级别有~6行。
我想要做的是循环团队的级别并比较成员国籍,看看这个国籍是否存在于其他角色列的任何级别。当匹配时我想要一个向量标记为1,当没有匹配时我想要一个变量用2标记。
插图
Team N1 N2
1 JPN US
1 US GER
1 DNK RUS
2 … …
2 … …
理想情况下,我的代码会为美国注册1,为JPN注册2
我见过像split,tapply等函数......但是我在编写匿名函数时遇到了问题,无法实现我想要的目标:
tapply(Data, TEAM_ID, function () for (i in N1){if (N1 %in% N2) Identifyingvect <= 1} else {Identifyingvect <= 2})
这可能可能用by
来解决,但我更喜欢data.table
用于这样的任务,在这些行之间(btw,tapply
是一个聚合函数,因此如果在N1
中存在欺骗,它将无法正确地为每个元素赋值)
library(data.table)
setDT(Data)[, res := (!N1 %in% N2) + 1L, by = Team]
老实说,我更喜欢保持res
逻辑,因为它更直观,更容易操作,但为了将2
分配给FALSE
匹配和1
到TRUE
匹配我必须寻找非匹配而不是匹配然后添加一个1