2016-09-16 2 views
-3

Скажем, у меня есть этот dataframe z:Ошибка при замене значения в кадре данных НСБУ

x <- c("NS","NS",NA) 
y <- c("yes","yes","b") 
z <- as.data.frame(cbind(x,y), stringsAsFactors=FALSE) 

> z 
    x y 
1 NS yes 
2 NS yes 
3 <NA> b 

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

z[z$x=="NS","yes"]<-"a" 
Error in `[<-.data.frame`(`*tmp*`, z$x == "NS", "yes", value = "a") : 
    missing values are not allowed in subscripted assignments of data frames 

Потому что по какой-то причине я получаю dataframe с НС, хотя я подмножество только "NS". Если удалить NA, я получаю другую ошибку:

na.omit(z[z$x=="NS","a"])<-"no" 
Error in na.omit(z[z$x == "NS", "a"]) <- "no" : 
    could not find function "na.omit<-" 
+1

Может 'г [г $ х == "NS", "у"] <-" «? Или, может быть, 'z [z $ y ==" yes "," y "] <-" a "' – zx8754

+0

, когда вы используете 'z [z $ x ==" NS "," yes "] <-" a " вы пытаетесь присвоить «a» столбцу «да», а строки «z $ x ==» NS », что вы хотите, это' z [z $ x == "NS", "y"] <- "a "' – DUWUDA

+0

также у вас, вероятно, будет проблема заменить «да» на «а», так как в настоящее время «z $ y» является фактором. взгляните на параметр 'stringsAsFactors'. Кроме того, из-за 'NA' в' z $ x', вероятно, лучше использовать '% in %' вместо' == ' – Cath

ответ

2

Первая проблема заключается в правильно указать имя переменной, то есть с именем а не значение (возможно, только опечатка в вашем вопросе): "y" и не "yes".

Тогда возникает другая проблема, когда вы используете == и пытается думать о том, что делать с NA в третьем ряду:

x=="NS" 
[1] TRUE TRUE NA 

Хмм, он должен быть или нет? Это не TRUE, не FALSE ... поэтому он просто дает ошибку, поскольку он не может «решить».

В то время как, используя %in% (который на самом деле match(x, table, nomatch = 0)), мы получим:

x %in% "NS" 
[1] TRUE TRUE FALSE 

Там вы идете, NA не совпадает со значением "NS" поэтому возвращает 0, или, в logical, FALSE: мы не должен его хранить.

Таким образом, чтобы получить то, что вы хотите:

z[z$x %in% "NS", "y"] <- "a" 
z 
#  x y 
#1 NS a 
#2 NS a 
#3 <NA> b 
+0

Это не выполняется для 'z <- structure (list (x = c (« NS »,« NS », NA), y = c («yes», «no», «b»)) .Names = c («x», «y»), row.names = c (NA, -3L), class = "data.frame") ' – 989

+0

@ m0h3n Что вы подразумеваете под этим? Проблема OP заключается в обработке «NA» в основном и, хотя вы, похоже, полагаетесь на слова OP, чтобы найти условие, чтобы превратить значения 'y' в' '' ', я полагаюсь на код OP. Пока никто не может знать, что является реальным условием, но на самом деле, это не вопрос, который имеет значение в этом Q ... (и если бы условие было на значении 'y', то у OP не было бы проблемы с NA начните с ...) – Cath

+0

Я предпочел бы оставить решение другим пользователям. – 989

0

Чтобы сделать его коротким, я хотел бы использовать:

x <- c("NS","NS",NA) 
y <- c("yes","yes","b") 
z <- as.data.frame(cbind(x,y)) 

z[, c('y')] <- ifelse(y == 'yes', 'a', y) 
+1

на самом деле вопрос о строках, где 'x' является' NS' ... – Cath

0

Почему это не просто:

z[!is.na(z$x=="NS") & z$y=="yes", "y"] <- "a" 

#  x y 
# 1 NS a 
# 2 NS a 
# 3 <NA> b 
+0

на самом деле вопрос в строках, где 'x'' 'NS' ... – Cath

+1

, но его проблема была указана в названии:' Ошибка при замене значение в кадре данных с NAs', поэтому OP хочет знать, как правильно обращаться с этим – Cath

+0

, я все еще не думаю, что 'z $ y ==" yes "' является правильным условием, и если бы это было, то было бы абсолютно без причины для проверки 'NA' в' x' ... – Cath

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