循环一个因子的水平和比较一个变量

问题描述:

我有一个因子和两个字符串字符列(国籍)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}) 
+0

嗨大卫,谢谢你的提示。我试过了,它似乎工作,但是我如何设置值为true为false?对不起,我是这个东西的新手! – Lowpar

+0

请参阅下面的答案。 –

这库仑d可能与by解决,但我更喜欢data.table这样的任务,这些行之间的东西(顺便说一下,tapply是一个聚合函数,因此它将无法正常工作分配值每个元素的情况下有N1

library(data.table) 
setDT(Data)[, res := (!N1 %in% N2) + 1L, by = Team] 

老实说,我宁愿保持res逻辑,因为它是两个更直观,更易于操作上,虽然以分配2FALSE比赛和1TRUE比赛我不得不寻找非匹配,而不是的比赛,然后添加一个1

+1

完美的作品!你是个天才和绅士!所以res默认设置为1,如果(!N1%in%N2)为真,那么它会添加一个? – Lowpar

+1

“res”没有默认值。它返回一个“TRUE”/“FALSE”向量,然后通过加1来转换为一个整数。就个人而言,如前所述,我认为只要使用'setDT(Data)[,%N2中的res2:= N1%,by = Team]''你会更好。然后你可以通过'Data [(res2)]'过滤如果你想看到匹配的数据。或者'Data [(!res2)]'如果你想要不匹配的。比'1'和'2' IMO好得多。 –

+0

这是有道理的,再次,我的无知会暗示做更低效的方式。最后一个问题,如果我可以?我将如何修改代码来检查N1列是否具有相同的国籍,换句话说,让我们假设在上面的示例中,第1队有第四行,在N1中标记为US,我如何检查是否在第N1列中的第1队。 – Lowpar