如何基于具有不同行数的另一个数据框的子集创建列
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$Name
在 a$Name
中有一个索引匹配,分配 df1$Group
-1。
如果 df1$Name
在 b$Name
中有索引匹配项,请为 df1$Group
分配 1。
否则,分配 df1$Group
'NA'。
希望已经清楚了。
我正在尝试根据来自不同数据框的子集在数据框中创建一个新列。
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$Name
在 a$Name
中有一个索引匹配,分配 df1$Group
-1。
如果 df1$Name
在 b$Name
中有索引匹配项,请为 df1$Group
分配 1。
否则,分配 df1$Group
'NA'。
希望已经清楚了。