Добавить факторы в df путем подстановки строк, содержащих определенные буквы - PullRequest
1 голос
/ 04 октября 2019

Это мои данные:

  Year variable value
 1951     MF12 1.441
 1952     MF12 2.068
 1953     RF12 2.008  
 1954     RF12 2.044
 1955     MW12 2.288
 1956     RW12 1.800

Где MF = управляемый кадр, RF = резервный кадр, MW = управляемый ветер, RW = резервный ветер. Итак, всего 4 разных уровня = Управляемый, Резервный, Кадровый, Ветровой.

Я хочу создать два типа факторов на основе этих уровней и добавить их в виде столбцов во фрейм данных. Фактор 1 будет иметь тип management.type (управляемый, резервный), а фактор 2 будет object.type (кадр, ветер).

Примерно так:

Year variable value Management Object
1951   MF12 1.37845 Managed      Frame 
1952   MF12 1.38950 Managed      Frame
1953   MW12 1.55510 Managed      Wind
1954   RF12 1.66125 Reserve      Frame
1955   RW12 1.62600 Reserve      Wind
1956   RW13 1.58760 Reserve      Wind

Как я могу это сделатьиспользуя R (а не возвращаться и сортировать в Excel)? Я думаю, что с точки зрения типа управления, возможно, используйте команду start.with для сортировки, начиная с 'M' или 'R', но не знаете, как это сделать. С точки зрения Объекта, есть ли способ сортировки по словам, которые содержат буквы «F» или «W»?

Ответы [ 3 ]

1 голос
/ 04 октября 2019

Использование

  • case_when() из dplyr, которое имеет преимущество перед ifelse(), что при работе с более чем двумя делами очень легко управляемо.
  • substr() для извлечения первой буквы, а затем второй буквы, для более сложных проверок grepl() с некоторым регулярным выражением.
df$Management <- dplyr::case_when(
  substr(df$variable, 1, 1) == "M" ~ "Managed",
  substr(df$variable, 1, 1) == "R" ~ "Reserved",
)

df$Object <- dplyr::case_when(
  substr(df$variable, 2, 2) == "F" ~ "Frame",
  substr(df$variable, 2, 2) == "W" ~ "Wind",
)

df
  Year variable value Management Object
1 1951     MF12 1.441    Managed  Frame
2 1952     MF12 2.068    Managed  Frame
3 1953     RF12 2.008   Reserved  Frame
4 1954     RF12 2.044   Reserved  Frame
5 1955     MW12 2.288    Managed   Wind
6 1956     RW12 1.800   Reserved   Wind

Воспроизводимые данные:

df <- data.frame(
  Year = 1951:1956, 
  variable = c("MF12", "MF12", "RF12", "RF12", "MW12", "RW12"), 
  value = c(1.441, 2.068, 2.008, 2.044, 2.288, 1.8),
  stringsAsFactors = FALSE
)
1 голос
/ 04 октября 2019

Мы можем использовать

library(dplyr)
df  %>%
    mutate(Management = factor(str_extract(variable, "^."),
          levels = c("M", "R"), labels = c("Managed", "Reserved")), 
          Object = factor(str_extract(variable, "(?<=^.)."), 
          levels = c("F", "W"), labels = c("Frame", "Wind")))
#   Year variable value Management Object
#1 1951     MF12 1.441    Managed  Frame
#2 1952     MF12 2.068    Managed  Frame
#3 1953     RF12 2.008   Reserved  Frame
#4 1954     RF12 2.044   Reserved  Frame
#5 1955     MW12 2.288    Managed   Wind
#6 1956     RW12 1.800   Reserved   Wind
1 голос
/ 04 октября 2019

Дайте grepl() и ifelse() попробовать:

df$Management <- ifelse(test = grepl(pattern = "M", x = df$variable), 
                        yes  = "Managed", 
                        no   = "Reserve")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...