Сопоставление с образцом и замена в R для таблицы средних - PullRequest
0 голосов
/ 09 июня 2018

Я новичок в R и что-то ломаю голову.

Я пытаюсь составить таблицу средних значений для конкретных измерений в соответствии с образцами осадков.(C2 - это одно имя сайта.) В некоторых случаях измерения ниже определенного порогового значения (например, в наборе данных одно измерение потока может составлять <0.01 фут / сек.) Поскольку <0.01 не является числовым, я удалил< с функцией gsub и средними значениями в соответствии со следующим:

data_C2_numeric <- data_C2
data_C2_numeric$flow = as.numeric(gsub("<","",data_C2_numeric$flow, ignore.case = TRUE))
table_averages_C2 <- aggregate(data_C2_numeric, list(data_C2_numeric$weather), FUN=mean, na.rm = TRUE)

И это похоже на работу.Однако после создания таблицы средних значений я хочу повторно вставить символ < , но , только если data_C2$flow содержит символ < в своем столбце.

Я знаю эту командувставит <, но вставит его независимо от того, содержит ли data_C2$flow <

table_averages_C2$flow = gsub("^", "<", table_averages_C2$flow) 

И я знаю, что эта команда используется для определения, содержит ли data_C2 <

startsWith(as.character(data_C2$flow), "<")

Так как я могу объединить эти две команды в одну, чтобы символ < вставлялся в table_averges_C2, только если он присутствовал в data_C2$flow?

Спасибо за любую помощь!

1 Ответ

0 голосов
/ 11 июня 2018

Вы можете использовать функцию sapply вместе с any(grepl(...)) или any(startsWith(...)), чтобы проверить, содержит ли какой-либо элемент, вошедший в агрегированные данные, <

#create data
data_C2<-data.frame(original=c("<0.1", "0.2", "0.3", "0.4", "0.5"))
data_C2$flow<-as.numeric(gsub("<","",data_C2$original, ignore.case = TRUE))
data_C2$weather<-c("DRY", "DRY", "RAIN", "RAIN", "RAIN")

data_C2
      original flow weather
1     <0.1  0.1     DRY
2      0.2  0.2     DRY
3      0.3  0.3    RAIN
4      0.4  0.4    RAIN
5      0.5  0.5    RAIN

table_averages_C2 <- aggregate(flow~weather, data=data_C2, FUN=mean, na.rm = TRUE)

#check if any flow number in weather group has "<" sign
table_averages_C2$qualifier<-sapply(table_averages_C2$weather, function(group) {
  ifelse(any(grepl("<", data_C2$original[which(data_C2$weather==group)])), "<", "")})

#add "<" to flow average
table_averages_C2$flow<-paste0(table_averages_C2$qualifier, table_averages_C2$flow)

table_averages_C2[,-3]
  weather  flow
1     DRY <0.15
2    RAIN   0.4
...