遍历一个因素的水平并将一个变量与另一个变量进行比较
Looping through levels of a factor and comparing one variable to another
我有一个 data.frame,其中包含一个因子和两个字符串字符列(国籍)。该因素有 2662 个级别,每个级别表示一个团队。团队有多个成员,因此每个级别都有 ~6 行。
我想做的是遍历团队的级别并比较成员的国籍,看看这个国籍是否存在于其他字符列的任何级别中。当有匹配时,我希望一个向量被标记为 1,当没有匹配时,我希望一个变量被标记为 2。
插图
Team N1 N2
1 JPN US
1 US GER
1 DNK RUS
2 … …
2 … …
理想情况下,我的代码会为美国注册 1,为日本注册 2
我见过 split、tapply 等函数...但是我在编写匿名函数来实现我想要的目标时遇到了问题:
tapply(Data, TEAM_ID, function () for (i in N1){if (N1 %in% N2) Identifyingvect <= 1} else {Identifyingvect <= 2})
这可能可以用 by
解决,但我更喜欢 data.table
来完成此类任务,这些行中的某些内容(顺便说一句,tapply
是一个聚合函数,因此它不会正确地为 each 元素赋值,以防 N1
)
中存在重复项
library(data.table)
setDT(Data)[, res := (!N1 %in% N2) + 1L, by = Team]
老实说,我更喜欢保持 res
合乎逻辑,因为它更直观且更易于操作,尽管为了将 2
分配给 FALSE
匹配和 1
到 TRUE
匹配我不得不寻找不匹配而不是匹配,然后添加 1
我有一个 data.frame,其中包含一个因子和两个字符串字符列(国籍)。该因素有 2662 个级别,每个级别表示一个团队。团队有多个成员,因此每个级别都有 ~6 行。
我想做的是遍历团队的级别并比较成员的国籍,看看这个国籍是否存在于其他字符列的任何级别中。当有匹配时,我希望一个向量被标记为 1,当没有匹配时,我希望一个变量被标记为 2。
插图
Team N1 N2
1 JPN US
1 US GER
1 DNK RUS
2 … …
2 … …
理想情况下,我的代码会为美国注册 1,为日本注册 2
我见过 split、tapply 等函数...但是我在编写匿名函数来实现我想要的目标时遇到了问题:
tapply(Data, TEAM_ID, function () for (i in N1){if (N1 %in% N2) Identifyingvect <= 1} else {Identifyingvect <= 2})
这可能可以用 by
解决,但我更喜欢 data.table
来完成此类任务,这些行中的某些内容(顺便说一句,tapply
是一个聚合函数,因此它不会正确地为 each 元素赋值,以防 N1
)
library(data.table)
setDT(Data)[, res := (!N1 %in% N2) + 1L, by = Team]
老实说,我更喜欢保持 res
合乎逻辑,因为它更直观且更易于操作,尽管为了将 2
分配给 FALSE
匹配和 1
到 TRUE
匹配我不得不寻找不匹配而不是匹配,然后添加 1