如何基于具有不同行数的另一个数据框的子集创建列

How to create column based on subsets from another dataframe with differing number of rows

我正在尝试根据来自不同数据框的子集在数据框中创建一个新列。

df<-data.frame(Name=c('Team 1','Team 1','Team 1', 'Team 2', 'Team 3','Team 3', 'Team 3','Team 4','Team 4'), In=c(8,25,2,2,1,3,3,9,24), Out=c(40,40,20,3,20,1,1,100,1), Group=c(1,1,1,-1,NA,NA,NA,1,1))

df1<-data.frame(Name=c('Team 1','Team 1','Team 1', 'Team 2','Team 2','Team 2','Team 2', 'Team 3','Team 3', 'Team 3','Team 4','Team 4'), In=c(8,25,2,2,1,3,3,9,24,35,14,19), Out=c(40,40,20,3,20,1,1,1,18,29,31,11))

df1$Group<-''

a<-subset(df,Group=='-1')
b<-subset(df,Group=='1')

head(df)
    Name In Out Group
1 Team 1  8  40     1
2 Team 1 25  40     1
3 Team 1  2  20     1
4 Team 2  2   3    -1
5 Team 3  1  20    NA
6 Team 3  3   1    NA
7 Team 3  3   1    NA
8 Team 4  9 100     1
9 Team 4 24   1     1

head(df1)
     Name In Out Group
1  Team 1  5   4      
2  Team 1  5   4      
3  Team 1 22   2      
4  Team 2 21  13      
5  Team 2 14  21      
6  Team 2 13  11      
7  Team 2 13  21      
8  Team 3 19  13      
9  Team 3 21  18      
10 Team 3 13  29      
11 Team 4 14  31      
12 Team 4 19  11     

我找到了我认为的答案here,这种方法不使用子集,但由于行的编号不同,它也不起作用。

df1$Group <- df$Group[match(df$Name,df1$Name)]
Error in `$<-.data.frame`(`*tmp*`, "Group", value = c(1, 1, 1, -1, 1,  : 
replacement has 9 rows, data has 12

我想要的结果是在 df1 中创建一个列 ('Group'),这样如果在子集 'a' 中找到 "Name",那么它会收到一个 '- 1',如果在子集 'b' 中找到该名称,则它会收到“1”,其他不适合该类别的所有内容要么留空,要么留空或 'NA'.

想要的结果示例:

 head(df1)
     Name In Out Group
1  Team 1  5   4     1
2  Team 1  5   4     1
3  Team 1 22   2     1
4  Team 2 21  13    -1
5  Team 2 14  21    -1
6  Team 2 13  11    -1
7  Team 2 13  21    -1
8  Team 3 19  13    NA
9  Team 3 21  18    NA
10 Team 3 13  29    NA
11 Team 4 14  31     1
12 Team 4 19  11     1

我正在使用的数据集仍在添加中,并且非常大,因此手动执行它是没有意义的。我已经坚持了一段时间,所以希望你们中的一个能帮助我解决这个问题。谢谢

@JasonAizkalns 几乎把它钉牢了,但我会尝试扩展他写的内容。

df1$Group <- ifelse(df1$Name %in% a$Name, -1, ifelse(df1$Name %in% b$Name, 1, NA)) 

ifelse() 是一个非常有用的函数。它需要三个参数 - 条件、第一个输出和 'else' 输出。如您所见,他在 'else' 条件下使用了另一个 ifelse()

关于%in%,来自文档:

%in% is a more intuitive interface as a binary operator, which returns a logical vector indicating if there is a match or not for its left operand.

所以,把它放在一起:

如果 df1$Namea$Name 中有一个索引匹配,分配 df1$Group -1。

如果 df1$Nameb$Name 中有索引匹配项,请为 df1$Group 分配 1。

否则,分配 df1$Group 'NA'。

希望已经清楚了。