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

时间:2016-04-21 17:49:03

标签: r dataframe subset

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

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中创建一个列(&#39; Group&#39;),以便在&#34; Name&#34;在子集&#39; a&#39;中找到,然后它会收到&#39; -1&#39;如果在子集&#39; b&#39;中找到该名称,则它会收到&#39; 39; 1&#39;以及其他不适合该类别的内容要么留空,要么为&#39; NA&#39;。

想要的结果示例:

 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

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

1 个答案:

答案 0 :(得分:0)

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

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

ifelse()是一个非常有用的功能。它需要三个参数 - 条件,第一个输出和其他&#39;否则&#39;输出。正如您所看到的,他在其他人中使用了另一个ifelse()&#39;条件。

关于%in%,来自文件:

  

%in%是一个更直观的接口,作为二元运算符,返回一个逻辑向量,指示其左操作数是否匹配。

所以,把它放在一起:

如果df1$Namea$Name中有索引匹配,请指定df1$Group -1。

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

否则,请指定df1$Group&#39; NA&#39;。

希望明白。