循环一个因子的水平和比较一个变量
我有一个因子和两个字符串字符列(国籍)data.frame。这个因素有2662个等级,每个等级代表一个团队。团队有多个成员,因此每个级别都有〜6排。循环一个因子的水平和比较一个变量
我想要做的是循环通过团队的水平,并比较一个成员国籍,看看这个国籍是否存在于任何其他字符栏的级别。当有比赛我想打上1向量,当没有比赛我想打上2.
插图变量
Team N1 N2
1 JPN US
1 US GER
1 DNK RUS
2 … …
2 … …
理想的情况下我的代码将注册1美国和2 JPN
我见过像分割功能,tapply,等...但我有写一个匿名函数来达到我想要的目标问题:
tapply(Data, TEAM_ID, function() for (i in N1){if (N1 %in% N2) Identifyingvect <= 1} else {Identifyingvect <= 2})
这库仑d可能与by
解决,但我更喜欢data.table
这样的任务,这些行之间的东西(顺便说一下,tapply
是一个聚合函数,因此它将无法正常工作分配值每个元素的情况下有N1
)
library(data.table)
setDT(Data)[, res := (!N1 %in% N2) + 1L, by = Team]
老实说,我宁愿保持res
逻辑,因为它是两个更直观,更易于操作上,虽然以分配2
到FALSE
比赛和1
到TRUE
比赛我不得不寻找非匹配,而不是的比赛,然后添加一个1
完美的作品!你是个天才和绅士!所以res默认设置为1,如果(!N1%in%N2)为真,那么它会添加一个? – Lowpar
“res”没有默认值。它返回一个“TRUE”/“FALSE”向量,然后通过加1来转换为一个整数。就个人而言,如前所述,我认为只要使用'setDT(Data)[,%N2中的res2:= N1%,by = Team]''你会更好。然后你可以通过'Data [(res2)]'过滤如果你想看到匹配的数据。或者'Data [(!res2)]'如果你想要不匹配的。比'1'和'2' IMO好得多。 –
这是有道理的,再次,我的无知会暗示做更低效的方式。最后一个问题,如果我可以?我将如何修改代码来检查N1列是否具有相同的国籍,换句话说,让我们假设在上面的示例中,第1队有第四行,在N1中标记为US,我如何检查是否在第N1列中的第1队。 – Lowpar
嗨大卫,谢谢你的提示。我试过了,它似乎工作,但是我如何设置值为true为false?对不起,我是这个东西的新手! – Lowpar
请参阅下面的答案。 –