2014-10-11 3 views
0

У меня есть простые данные для практики, и когда я пытался вычислить максимальное, минимальное население каждого раза как ниже, у меня появились предупреждающие сообщения типа «In max (state $ time.population [look.at]): нет не пропущенных аргументов до max; return -Inf". Я попытался запустить цикл один за другим, вручную меняя «зону» каждый раз, и все они работали. Я не уверен, в чем причина. Есть места для каждого уровня зоны, поэтому я задаюсь вопросом, причина в этом - я попытался изменить ее на характер, но она все еще не сработала ... кто-нибудь знает, как я могу это исправить?для цикла по переменной фактора в R (уровни - это символы с пробелами). Возвращаемое предупреждающее сообщение «no uns missing arguments to max»

state <- read.csv("states.csv") 
state$population <- as.numeric(gsub("\\,","",state$population)) 

/* the.zones < - уникальный (состояние $ time.zone.1) the.zones < - as.character (the.zones) */

/Новые линии/

state$time.zone.1 <- as.character(state$time.zone.1) 
the.zones <- unique(state$time.zone.1) 


low <- c() 
high <-c() 
for (zone in the.zones){ 
    look.at <- state$time.zone.1 == zone 
    low <- append(low,min(state$population[look.at])) 
    high <-append(high,max(state$time.population[look.at])) 
} 
    low 
    high 

Result: 
Warning messages: 
1: In max(state$time.population[look.at]) : 
    no non-missing arguments to max; returning -Inf 
2: In max(state$time.population[look.at]) : 
    no non-missing arguments to max; returning -Inf 
3: In max(state$time.population[look.at]) : 
    no non-missing arguments to max; returning -Inf 
4: In max(state$time.population[look.at]) : 
    no non-missing arguments to max; returning -Inf 
5: In max(state$time.population[look.at]) : 
    no non-missing arguments to max; returning -Inf 
6: In max(state$time.population[look.at]) : 
    no non-missing arguments to max; returning -Inf 

Дополнительная информация: Уровни часовых поясов: Уровни: СЗНТ (UTC + 09) CST (UTC + 6) EST (UTC-5) HST (UTC + 10) МТ (UTC + 07) ПТ (UTC-8) Если изменить на символы: «CST (UTC-6)» «AKST (UTC-09)» «MT (UTC-07)» «PT (UTC-8)» «EST (UTC-5)» «HST (UTC -10) "

Что данные выглядит следующим образом:

 name abbreviation  capital most.populous.city population square.miles time.zone.1 
1 ALABAMA   AL Montgomery   Birmingham 4,708,708  52,423 CST (UTC-6) 
2  ALASKA   AK  Juneau   Anchorage 698,473  656,425 AKST (UTC-09) 
3 ARIZONA   AZ  Phoenix   Phoenix 6,595,778  114,006 MT (UTC-07) 
4 ARKANSAS   AR Little Rock  Little Rock 2,889,450  53,182 CST (UTC-6) 
5 CALIFORNIA   CA Sacramento  Los Angeles 36,961,664  163,707  PT (UTC-8) 
6 COLORADO   CO  Denver    Denver 5,024,748  104,100 MT (UTC-07) 
+0

Без дополнительной информации о том, как вы читаете данные, это упражнение бесполезно. Пожалуйста, предоставьте готовый MWE, где вы читаете образец данных, а также предоставляете эти данные в виде файла или в виде встроенного кадра данных. – epsilone

+0

Это данные, которые я распечатывал после того, как прочитал в исходном файле csv. Я не думаю, что в процессе импорта есть какая-то проблема. – miaoxingren

ответ

1

возможные причины две:

1) Там нет $time.population уровня на state списке. Это создает переменную NULL, которая обрабатывается min, возвращая это предупреждение. Попробуйте сами:

min(NULL) 

2) (Скорее всего) Переменная look.at является numeric(0), поскольку логическое равенство state$time.zone.1 == zone никогда не выполняется, поэтому он возвращает это значение. Проверьте это для себя:

min(numeric(0)) 

Для предотвращения обоих случаев, избежать вычисления min таких векторов добавления условной, поэтому для вычисления минимума только тогда, когда !is.null(look.at) (первая точка) и length(look.at)!=0 (второй пункт) выполнены.


EDIT: Есть другие несколько вещей, которые могут вызвать проблемы:

1) state$population <- as.numeric(gsub("\\,","",state$population)) это может потенциально возвращать numeric(0).

2) Еще одна странная вещь, вы делаете преобразование в character здесь:

the.zones <- unique(state$time.zone.1) 
the.zones <- as.character(the.zones) 

Но тогда вы сравнить исходные данные (state$time.zone.1) с преобразованный в character (zone in the.zone), который, безусловно, является не самым безопасным способ сделать сравнение и может привести к mismatchs если плохое преобразование происходит:

for(zone in the.zone){ 
    look.at <- state$time.zone.1 == zone 
    ... 
} 

либо конвертировать state$time.zone.1 в character или не конвертировать the.zones.

+0

Спасибо за ответы! У меня есть полные данные для населения (нет пропущенных данных, и это непрерывный числовой). Ранее я упомянул в своем вопросе, что я запускаю программу шаг за шагом сам, и это сработало; это означает, что я запускал код, как показано ниже, и указывал $ time.zone.1 == все зоны были удовлетворены: look.at <- state $ time.zone.1 == "CST (UTC-6)"; low <- append (low, min (state $ population [look.at])); high <-append (высокий, max (состояние $ time.population [look.at])). Каждый раз, когда я менял значение зоны на фактический уровень, и все уравнения были удовлетворены. – miaoxingren

+0

Я отредактировал ответ с другими вещами, которые будут хорошо смотреть. Если это не сработает, вам нужно будет предоставить MWE (т. Е. Небольшую часть данных), где вы получите ошибку. Проверка вручную не означает, что это не сработает для конкретной зоны. Удачи! – epsilone

+0

Я только что добавил данные в нижней части моего вопроса. Хорошо, что the.zones и time.zone.1 могут не иметь одного и того же типа - я просто попытался сначала изменить time.zone.1 на символ, а затем создать the.zones из символа time.zone. 1, но это все еще не сработало. Я добавил новую программу как «Новые строки» в моем окне вопросов. «State $ population <- as.numeric (gsub (« \\, »,« », state $ population))« было просто удалить запятую в данных, и это получилось хорошо. – miaoxingren