Ошибка при нахождении среднего значения столбца, термин ошибки: «аргумент не числовой c или логический: возврат NA [1] NA» - PullRequest
0 голосов
/ 30 марта 2020

Я использовал этот код, чтобы найти среднее значение, он каким-то образом работал, когда я запускал блок, но когда я перезапускал весь блокнот, появлялся термин ошибки.


    # What is the mean suspension rate for schools  overall?
    transform(merged_data, suspension_rate_total = as.numeric(suspension_rate_total))
    mean(merged_data$suspension_rate_total,na.rm = T)
    mean(merged_data[7])

    # What is the mean suspension rate for schools with farms > 100? 
    mean(merged_data$suspension_rate_total[merged_data$farms < 100], na.rm = T)

    # What is the mean suspension rate for schools with farms < 100? 
    mean(merged_data$suspension_rate_total[merged_data$farms < 100], na.rm = T)
argument is not numeric or logical: returning NA[1] NA

Это данные:

Данные

structure(list(schid = c("1030642", "1030766", "1030774", "1030840", 
"1130103", "1230150"), farms = c("132", "116", "348", "406", 
"68", "130"), foster = c("2", "0", "1", "8", "1", "4"), homeless = c("14", 
"0", "8", "4", "1", "4"), migrant = c("0", "0", "0", "0", "0", 
"0"), ell = c("18", "12", "114", "45", "7", "4"), suspension_rate_total = c("*", 
"20", "0", "0", "95", "5"), suspension_violent = c("*", "9", 
"0", "0", "20", "2"), suspension_violent_no_injury = c("*", "6", 
"0", "0", "47", "1"), suspension_weapon = c("*", "0", "0", "0", 
"8", "0"), suspension_drug = c("*", "0", "0", "0", "9", "1"), 
    suspension_defiance = c("*", "1", "0", "0", "9", "1"), suspension_other = c("*", 
    "4", "0", "0", "2", "0")), row.names = c(NA, 6L), class = "data.frame")

Ответы [ 2 ]

0 голосов
/ 30 марта 2020

Вы снова! : D

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

merged_data<-apply(merged_data,2,as.numeric)


вы всегда должны учитывать ваши классы при работе с R

запустите этот код, чтобы проверить его!

A_character <- "1"
a_num<-1

class(a_num)
[1] "numeric"

class(A_character)
[1] "character"

class(A_character)==class(a_num)
[1] FALSE

class(A_character)!=class(a_num)
[1] TRUE

также работает на data.frames

df<- data.frame(c(1:3),c("1","2","3"))
colnames(df)<- c("numbers","not_numbers")
class(df$numbers)
class(df$not_numbers)
df$not_numbers<-as.character(df$not_numbers)
df$numbers<-as.numeric(df$numbers)
class(df$numbers)
class(df$not_numbers)

0 голосов
/ 30 марта 2020

Если мы проверим str(merged_data), столбцы равны character, его необходимо преобразовать в numeric

mean(as.numeric(merged_data$suspension_rate_total)[as.numeric(merged_data$farms)
                  < 100], na.rm = TRUE)
#[1] 95

При преобразовании в numeric появится предупреждающее сообщение поскольку есть некоторые элементы, которые не нумеруются c, которые преобразуются в NA

...