#r #excel #tidyverse
#r #excel #tidyverse
Вопрос:
У меня есть эти данные о концентрации PM10 в Германии. Его можно скачать по этой [ссылке] (https://www.umweltbundesamt.de/sites/default/files/medien/4640/dokumente/pm10_2019_0.xlsx )
В Excel это выглядит примерно так:
Эта проблема здесь заключается в том, что для каждого из 16 состояний существует «объединенная» одна строка, и до следующей строки такого рода существуют отдельные станции, которые измеряют концентрацию PM10. Что я хотел бы сделать сейчас, так это создать новый столбец для каждого состояния, каждое из которых присваивает имя состояния каждому измерению.
Честно говоря, я понятия не имею, как это сделать в R. Я полагаю, что может быть какой-то обходной путь с чем-то в псевдокоде, например
state = None
for each row:
if (NA in Statiocode):
state = Name
else:
new_col = state
Похоже ли это на какой-то правильный подход?
Ответ №1:
Простой этот код подойдет
library(readxl)
data <- read_excel("pm10_2019_0.xlsx", skip = 46)
library(tidyverse)
data <- data %>% mutate(State = ifelse(is.na(Stationscode), `Name / Messnetz`, NA)) %>%
fill(State) %>% filter(!is.na(Stationscode)) %>% select(State, everything())
data
# A tibble: 376 x 7
State Stationscode `Name / Messnetz` Stationsumgebung `Art der Station` `Jahresmittelwert ~ `Zahl der Tageswerte ~
<chr> <chr> <chr> <chr> <chr> <dbl> <dbl>
1 Baden-Wü~ DEBW029 Aalen vorstädtisches Ge~ Hintergrund 14 0
2 Baden-Wü~ DEBW076 Baden-Baden vorstädtisches Ge~ Hintergrund 12 0
3 Baden-Wü~ DEBW042 Bernhausen vorstädtisches Ge~ Hintergrund 16 2
4 Baden-Wü~ DEBW046 Biberach vorstädtisches Ge~ Hintergrund 14 0
5 Baden-Wü~ DEBW004 Eggenstein ländlich stadtnah Hintergrund 15 0
6 Baden-Wü~ DEBW220 Esslingen Grabbrunn~ städtisches Gebiet Verkehr 23 16
7 Baden-Wü~ DEBW084 Freiburg städtisches Gebiet Hintergrund 13 2
8 Baden-Wü~ DEBW122 Freiburg Schwarzwal~ städtisches Gebiet Verkehr 15 3
9 Baden-Wü~ DEBW038 Friedrichshafen städtisches Gebiet Hintergrund 14 1
10 Baden-Wü~ DEBW112 Gärtringen vorstädtisches Ge~ Hintergrund 13 1
# ... with 366 more rows
Ответ №2:
Я надеюсь, что следующее поможет
data <- read_excel("pm10_2019_0.xlsx", skip = 46)
names <- data %>% filter(is.na(Stationscode)) %>% select(`Name / Messnetz`)
index <- which(is.na(data$Stationscode))
for(i in 1:nrow(data)){
data[i,"City"] <- cut(i, breaks = c(index, nrow(data)), labels = names$`Name / Messnetz`)
}
data <- data %>% filter(!is.na(Stationscode))