2016-04-21 2 views
0

Я пытаюсь создать новый столбец в фрейме данных на основе подмножеств из другого фрейма данных.Как создать столбец на основе подмножеств из другого фрейма данных с различным количеством строк

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 

То, что я хочу для моего исхода, чтобы создать столбец («Group») в df1 так, что если «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 

наборы данных Я работаю с все еще добавляются к, и очень большие, и поэтому бессмысленно делать это вручную. Я застрял на этом некоторое время, так что, надеюсь, один из вас может помочь мне разобраться в этом. Благодарю.

+0

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

+0

Это казалось неловко легким, спасибо ! –

ответ

0

@JasonAizkalns в значительной степени прибивает его, но я попытаюсь расширить то, что он написал.

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

ifelse() - очень полезная функция. Он принимает три аргумента - условие, первый вывод и вывод «else». Как вы можете видеть, он использовал еще один ifelse() в состоянии «еще».

Что касается %in%, из документации:

% в% является более интуитивным интерфейсом в виде двоичного оператора, который возвращает логический вектор, указывающий, если есть совпадение или нет для его левого операнда.

Таким образом, положить его вместе:

Если df1$Name имеет индексный матч в a$Name, назначить df1$Group -1.

Если df1$Name имеет индексный матч в b$Name назначьте df1$Group 1.

Else, назначить df1$Group 'NA'.

Надеюсь, что это ясно.

+0

Это имеет смысл, спасибо! –

 Смежные вопросы

  • Нет связанных вопросов^_^