не может преобразовать символ в число в R

Я скопировал и вставил информацию о погоде со следующего веб-сайта Weather Underground для некоторого анализа данных, и данные выглядят следующим образом:

https://www.wunderground.com/dashboard/pws/KCACHINO13/table/2018-04-10/2018-04-10/daily

введите здесь описание изображения

Как видите, температура и другая информация сопровождаются текстом, поэтому я не могу проводить какие-либо расчеты. В Excel я использовал замену (xx, F,), чтобы удалить F из столбца «Температура», но затем я хотел преобразовать фаренгейты в градусы Цельсия, используя convert (xx, F, C), я не мог получить результат. Я думаю, что что-то не так с самими данными. Я отформатировал ячейку в число или скопировал и вставил значение в новый столбец, но ни один из них не работал.

Затем я импортирую data.frame в R и пытаюсь отформатировать данные с помощью R. Я проверил класс столбца Temperature, который показывает характер:

class(a$Temperature)
#"character"

a$Temperature <- gsub("F","",a$Temperature)
# this command remmoved "F"

as.numeric(a$Temperature)
#Warning message: NAs introduced by coercion 

as.numeric(unlist(a$Temperature))
#still the same warning message

В Excel я создал новый столбец, удалив F из температуры, и использовал его в R для преобразования символа в число, но все равно получил предупреждающее сообщение. Я не знаю, как справиться с этой проблемой. Может ли кто-нибудь помочь мне с этим? Спасибо!

Как рекомендовано ниже, я вставляю вывод из

dput(head(a))

#structure(list(Time = structure(c(-2209075140, -2209074840, -2209074540, 
-2209074240, -2209073940, -2209073640), tzone = "UTC", class = c("POSIXct", 
"POSIXt")), Temperature = c("60.0 ", "59.9 ", "59.8 ", "59.7 ", 
"59.6 ", "59.5 "), `T(F)` = c("60.0 ", "59.9 ", "59.8 ", "59.7 ", 
"59.6 ", "59.5 "), `Dew Point` = c("48.2 F", "48.1 F", "48.4 F", 
"48.3 F", "48.2 F", "48.1 F"), Humidity = c("65 %", "65 %", "66 %", 
"66 %", "66 %", "66 %"), Wind = c("WSW", "WSW", "WSW", "WSW", 
"WSW", "WSW"), Speed = c("0.0 mph", "0.0 mph", "0.0 mph", "0.0 mph", 
"0.0 mph", "0.0 mph"), Gust = c("0.0 mph", "0.0 mph", "0.0 mph", 
"0.0 mph", "0.0 mph", "0.0 mph"), Pressure = c("29.88 in", "29.88 in", 
"29.88 in", "29.88 in", "29.88 in", "29.88 in"), `Precip. Rate.` = c("0.00 in", 
"0.00 in", "0.00 in", "0.00 in", "0.00 in", "0.00 in"), `Precip. Accum.` = c("0.00 in", 
"0.00 in", "0.00 in", "0.00 in", "0.00 in", "0.00 in"), UV = c(0, 
0, 0, 0, 0, 0), Solar = c("0 w/m²", "0 w/m²", "0 w/m²", "0 w/m²", 
"0 w/m²", "0 w/m²")), row.names = c(NA, -6L), class = c("tbl_df", 
"tbl", "data.frame"))

person XM_Z    schedule 27.08.2020    source источник
comment
что такое печать $Temperature? Я подозреваю, что это либо символ степени, либо пробел между числом   -  person NotThatKindODr    schedule 27.08.2020
comment
Не могли бы вы использовать dput(head(your_data_object _here)), запустить его, скопировать результат и вставить в свой пост?   -  person Tho Vu    schedule 27.08.2020
comment
@NotThatKindODr Вы правы, есть символ градуса, но он не отображается ни в excel, ни в моем r data.frame a. Думаю, в этом проблема.   -  person XM_Z    schedule 28.08.2020
comment
@ThoVu Я вставил вывод в пост :)   -  person XM_Z    schedule 28.08.2020
comment
@XM_Z Ты сделал почти то, что я собирался порекомендовать в этом случае.   -  person NotThatKindODr    schedule 28.08.2020


Ответы (2)


Если вы хотите преобразовать только столбец температуры, вот вариант, который вы можете рассмотреть.

Данные

df <- structure(list(Time = c("12:04 AM", "12:09 AM", "12:14 AM", "12:19 AM", 
"12:24 AM", "12:29 AM"), Temperature = c("69.4 F", "69.2 F", 
"68.8 F", "68.5 F", "68.3 F", "68.0 F"), Dew.Point = c("45.9 F", 
"46.0 F", "45.8 F", "45.7 F", "45.7 F", "45.7 F"), Humidity = c("43 %", 
"43 %", "44 %", "44 %", "44 %", "45 %"), Wind = c("NE", "NE", 
"NE", "NE", "NE", "NE"), Speed = c("0.0 mph", "0.0 mph", "0.0 mph", 
"0.0 mph", "0.0 mph", "0.0 mph"), Gust = c("0.0 mph", "0.0 mph", 
"0.0 mph", "0.0 mph", "0.0 mph", "0.0 mph"), Pressure = c("29.93 in", 
"29.94 in", "29.94 in", "29.95 in", "29.95 in", "29.95 in"), 
    Precip..Rate. = c("0.00 in", "0.00 in", "0.00 in", "0.00 in", 
    "0.00 in", "0.00 in"), Precip..Accum. = c("0.00 in", "0.00 in", 
    "0.00 in", "0.00 in", "0.00 in", "0.00 in"), UV = c(0L, 0L, 
    0L, 0L, 0L, 0L), Solar = c("0 w/m²", "0 w/m²", "0 w/m²", 
    "0 w/m²", "0 w/m²", "0 w/m²")), class = "data.frame", row.names = c(NA, 
-6L))

Код

library(dplyr)
library(stringr)
df2 <- df %>% 
  mutate(Temperature2 = as.numeric(str_extract(Temperature, "[\\d\\.]+"))) %>% 
  relocate(Temperature2, .after = Temperature)

df2[, 2:3]
#   Temperature Temperature2
# 1      69.4 F         69.4
# 2      69.2 F         69.2
# 3      68.8 F         68.8
# 4      68.5 F         68.5
# 5      68.3 F         68.3
# 6      68.0 F         68.0
str(df2$Temperature2)
# num [1:6] 69.4 69.2 68.8 68.5 68.3 68
person Tho Vu    schedule 27.08.2020
comment
relocate - отличная функция, я не знал, что она существует, спасибо, что поделились - person NotThatKindODr; 28.08.2020
comment
Благодарю вас! Могу я спросить о функции перемещения? Я получил сообщение R: Ошибка в перемещении (., Temperature2,. . - person XM_Z; 29.08.2020
comment
Он доступен для версии dplyr › 1.0.0. Если вы обновитесь до последней версии, то вам сюда. Вы можете смело удалить его, если он вам не нравится. Здесь я просто делаю так, чтобы вам было проще увидеть результат. - person Tho Vu; 29.08.2020
comment
Это сработало! Я применил этот код к своему data.frame, и он работает для всех столбцов. Благодарю вас! У меня есть еще один вопрос: я пытался найти [\\d\\.]+, но не совсем понимаю. \d означает любую цифру, \. означает период, а + означает одно или несколько повторений. Что означает первый символ \ и что означает весь этот код вместе взятый? - person XM_Z; 29.08.2020
comment
@XM_Z : \\d соответствует цифрам, а \\. должен соответствовать точке. - person Tho Vu; 29.08.2020
comment
Поскольку д и . являются специальными символами, нам нужно экранировать их, используя \\ в R. Код означает, что мы будем сопоставлять все цифры и точку. Мы не получаем ничего другого. Затем мы можем преобразовать в числовые числа. - person Tho Vu; 29.08.2020
comment
Я понимаю. Спасибо за ваше объяснение! Это очень помогает! - person XM_Z; 30.08.2020

Может это, помогает. В эту функцию вложено несколько различных функций, таких как переход от символьной переменной к числовой. Также gsub, который заменяет запятую на пустое место. Вы должны просто изменить запятую на букву, которую вы меняете. Никогда не пробовал, работает ли он с буквами, но это может быть одним из решений. Вот код:

data666 ‹- применить (данные, 2, функция (x) as.numeric (as.character (gsub (,, , x))))

Функция Apply применяет функции ко всему набору данных. 2 означает, что он делает это столбец за столбцом. Если вы хотите изменить его строку за строкой, вам нужно изменить 2 на 1.

person Joel Länsisalmi    schedule 28.08.2020