我正在尝试根据来自不同数据框的子集在数据框中创建一个新列。
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
我正在使用的数据集仍然被添加到,并且非常大,因此手动执行它是没有意义的。我已经坚持了一段时间,所以希望你们中的一个可以帮助我解决这个问题。感谢。
答案 0 :(得分:0)
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$Name
在a$Name
中有索引匹配,请指定df1$Group
-1。
如果df1$Name
在b$Name
中有一个索引匹配,请为df1$Group
分配1。
否则,请指定df1$Group
&#39; NA&#39;。
希望明白。