R

时间:2017-12-05 18:58:39

标签: r

我有这样的数据:

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中完成此操作?

1 个答案:

答案 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