我有这样的数据:
ID 1a 2a 3a 1b 2b 3b Name Team
cb128c James John Bill Jeremy Ed Simon Simon Wolves
cb128c John James Randy Simon David Ben John Tigers
ko351u Adam Alex Jacob Bob Oscar David Oscar Sparrows
ko351u Adam Matt Sam Fred Frank Harry Adam Wildcats
我想通过匹配ID列中该行的行ID,并通过匹配“名称”中该行的“a”列之一中的一个名称来添加指示A和B组的列列(对于A队),并使用该行的“b”列之一中的一个名称为B队做同样的事情:
ID 1a 2a 3a 1b 2b 3b Name Team Team A Team B
cb128c James John Bill Jeremy Ed Simon Simon Wolves Tigers Wolves
cb128c John James Randy Simon David Ben John Tigers Tigers Wolves
ko351u Adam Alex Jacob Bob Oscar David Oscar Sparrows Wildcats Sparrows
ko351u Adam Matt Sam Fred Frank Harry Adam Wildcats Wildcats Sparrows
在第1行中,我们知道A队是Tigers,因为我们匹配ID列中第1行,cb128c的ID,以及第1行(James,John或Bill)中的一个“a”名称名称列。在这种情况下,第2行具有该ID,cb128c,并且在“名称”列中具有“John”。第2行的团队是“老虎队”。因此,第1排的A队是老虎队。 B队是Wolves,因为我们在Name列中匹配第1行的ID,仍然是cb128c,以及第1行(Jeremy,Ed或Simon)中的一个“b”名称。在这种情况下,第1行本身具有我们正在寻找的数据,因为其中一个“b”名称出现在该行的“名称”列中(Simon)。每行中列出的“团队”将始终是该行的A队或B队。
再往下,我们知道第3行的第A组是Wildcats,因为我们在“名称”列中匹配第3行的ID,ko351u和第3行的“a”名称(Adam,Alex或Jacob)之一。第4行在“名称”列中具有该ID和“Adam”。因此,第4行的团队是第3行的A队。
另请注意,David在第3排换了球队。在第2排,大卫在Simon队,我们知道是狼队(如上所述),但是当我们匹配第3排的ID和第3排的“b”时名字(鲍勃,奥斯卡或大卫),我们得到麻雀(就像第1行,其中一个“b”名称出现在同一行的名称栏中,因此团队B是该行中列出的团队)。
如何在R中完成此操作?
答案 0 :(得分:1)
df = read.table(text = "ID 1a 2a 3a 1b 2b 3b Name Team
cb128c James John Bill Jeremy Ed Simon Simon Wolves
cb128c John James Randy Simon David Ben John Tigers
ko351u Adam Alex Jacob Bob Oscar David Oscar Sparrows
ko351u Adam Matt Sam Fred Frank Harry Adam Wildcats", header = T)
# convert to character
df[] = lapply(df, as.character)
library(tidyr)
library(dplyr)
以下代码1.收集长格式,2。创建" Team_A"和#34; Team_B"超出a或b后缀,3。匹配名称以填写A / B团队名称,4。删除缺失值(不匹配),5。删除不必要的列,6。转换回宽格式,7。将A组和B组加入原始数据。
我鼓励您逐行浏览代码以了解正在发生的事情。我会把列重新排序给你。
result = gather(df, key = "key", value = "value", starts_with("X")) %>%
mutate(ab = paste0("Team_", toupper(substr(key, start = nchar(key), stop = nchar(key)))),
team = ifelse(Name == value, Team, NA)) %>%
filter(!is.na(team)) %>%
select(ID, ab, team) %>%
spread(key = ab, value = team) %>%
right_join(df)
result
# ID Team_A Team_B X1a X2a X3a X1b X2b X3b Name Team
# 1 cb128c Tigers Wolves James John Bill Jeremy Ed Simon Simon Wolves
# 2 cb128c Tigers Wolves John James Randy Simon David Ben John Tigers
# 3 ko351u Wildcats Sparrows Adam Alex Jacob Bob Oscar David Oscar Sparrows
# 4 ko351u Wildcats Sparrows Adam Matt Sam Fred Frank Harry Adam Wildcats