2017-01-09 12 views
0

У меня есть небольшой кадр данных, как это:R: Как заменить строки в столбце с условием на второй столбец?

a<-c("green","green","green","green","green","green","green","green","green","green") 
b<-c("blue","red","blue","red","blue","red","blue","red","blue","red") 
df<-data.frame(a,b) 
df 
     a b 
1 green blue 
2 green red 
3 green blue 
4 green red 
5 green blue 
6 green red 
7 green blue 
8 green red 
9 green blue 
10 green red 

, и я хотел бы заменить «зеленый» на «желтый», где б == «красный»

Я могу выбрать эти строки по df[b=="red",] но замена не работает. Я пробовал:

> df[b=="red",]$a<-gsub("green","yellow",df[b=="red",]) 
Fehler in `$<-.data.frame`(`*tmp*`, "a", value = c("c(1, 1, 1, 1, 1)", : 
    replacement has 2 rows, data has 5 

или

> df$a[subset(df$a,df$b=="red")]<-"yellow" 
Warnmeldung: 
In `[<-.factor`(`*tmp*`, subset(df$a, df$b == "red"), value = c(NA, : 
    invalid factor level, NA generated 
> df 
     a b 
1 <NA> blue 
2 green red 
3 green blue 
4 green red 
5 green blue 
6 green red 
7 green blue 
8 green red 
9 green blue 
10 green red 

и

> df[b=="red",]$a<-"yellow" 
Warnmeldung: 
In `[<-.factor`(`*tmp*`, iseq, value = c("yellow", "yellow", "yellow", : 
    invalid factor level, NA generated 
> df 
     a b 
1 green blue 
2 <NA> red 
3 green blue 
4 <NA> red 
5 green blue 
6 <NA> red 
7 green blue 
8 <NA> red 
9 green blue 
10 <NA> red 

Ничего из этого не работает должным образом для моего вопроса. Каким будет самое простое решение? Большое спасибо, Треппенлифт.

+2

Попробуйте 'df <- data.frame (a, b, strAsAsFactors = FALSE); df [df $ b == 'red', 1] <- 'yellow''. Проблема в том, что 'R' устанавливает' strAsAsFactors = TRUE' по умолчанию при вызове 'data.frame'. – bouncyball

+0

вам также нужно иметь 2 условия: 'df $ b ==" red "' и 'df $ a ==" green "' incase of such cases in data –

+0

@bouncyball Это решение работает нормально. Спасибо – treppenlift

ответ

0

Вы можете использовать функциональность. Для некоторых примеров см. http://www.endmemo.com/program/R/which.php.

df[which(df[,2]=="red"),1] <- "yellow" 
+0

'который' на самом деле не нужен здесь. Удаление функции будет очень просто: 'df [df [, 2] == 'red',]' – bouncyball

+0

Вы правы, это еще быстрее. – Christov