Извлекать только две переменные из столбца

#r

#r

Вопрос:

У меня есть фрейм данных в R, для которого один столбец имеет несколько переменных. Переменные либо начинаются с ABC, DEF , GHI . За этими переменными следует серия из 6 чисел (например, ABC052689, ABC062895, DEF045158).

Для каждой строки я хотел бы извлечь один экземпляр ABC (тот, у которого наибольшее число).

Если в строке есть ABC052689, ABC062895, DEF045158, я бы хотел, чтобы он извлек ABC062895, потому что он больше, чем ABC052689.

Затем я хотел бы сделать то же самое для переменной, которая начинается с DEF###### .

Мне удалось отфильтровать данные, чтобы иметь строки, в которых есть ABC и либо DEF, либо GHI:

 library(tidyverse)
data_with_ABC <- test %>% 
  filter(str_detect(car,"ABC"))

data_with_ABC_and_DEF_or_GHI <- data_with_ABC %>% 
  filter(str_detect(car, "DEF") | str_detect(car, "GHI"))
  

Я не знаю, как извлечь, скажем, ABC с наибольшим числом

 ABC052689, ABC062895, DEF045158 -> ABC062895
  

Комментарии:

1. Для ясности: dataframe test содержит один столбец, car , где каждая строка этого столбца является строкой, разделенной запятыми?

2. Да, @neilfws вы правы. фрейм данных ‘test’ содержит один столбец ‘car’, где каждая строка содержит строку, разделенную запятыми

Ответ №1:

Для базового решения R мы можем попробовать использовать lapply along with strsplit для определения наибольшего ABC значения в каждой строке CSV, в каждой строке.

 df <- data.frame(car=c("ABC052689,ABC062895,DEF045158"), id=c(1),
    stringsAsFactors=FALSE)
df$largest <- lapply(df$car, function(x) {
    cars <- strsplit(x, ",", fixed=TRUE)[[1]]
    cars <- cars[substr(cars, 1, 3) == "ABC"]
    max <- cars[which.max(substr(cars, 4, 9))]
    return(max)
})
df

                            car id   largest
1 ABC052689,ABC062895,DEF045158  1 ABC062895
  

Обратите внимание, что нам не нужно беспокоиться о приведении подстроки номера таблички, потому что это текст фиксированной ширины. Это означает, что он должен правильно сортироваться даже как текст.

Комментарии:

1. спасибо @Tim Biegeleisen, я неправильно сформулировал свой вопрос. столбец car содержит строку, разделенную запятыми, которая может содержать несколько экземпляров ABC, DEF и или GHI

2. поскольку я новичок в R, я пытаюсь выяснить, что делает каждый шаг, и большая часть этого довольно ясна, за исключением части ‘[[1]]’ в функции strsplit. Я вижу это в документации R для strsplit, но оно не определено

3. @rdavis strsplit возвращает список, поэтому [[1]] указывает на доступ к первому элементу в списке, который содержит вектор разделенных терминов.

Ответ №2:

Помимо ответа Тима, если вы хотите выполнить все ABC / DEF за один раз, следующий код может помочь с library(tidyverse) :

 > df <- data.frame(car=c("ABC052689", "ABC062895", "DEF045158", "DEF192345"),                  stringsAsFactors=FALSE)
> 
> df2 = df %>% 
      mutate(state = str_sub(car, 1, 3), plate = str_sub(car, 4, 9))
> 
> df2
        car state  plate
1 ABC052689   ABC 052689
2 ABC062895   ABC 062895
3 DEF045158   DEF 045158
4 DEF192345   DEF 192345
> 
> df2 %>% 
    group_by(state) %>% 
    summarise(maxplate = max(plate)) %>% 
    mutate(full = str_c(state, maxplate))
# A tibble: 2 x 3
  state maxplate full     
  <chr> <chr>    <chr>    
1 ABC   062895   ABC062895
2 DEF   192345   DEF192345
  

Комментарии:

1. спасибо @liuminzhao, я неправильно сформулировал свой вопрос. столбец car содержит строку, разделенную запятыми, которая может содержать несколько экземпляров ABC, DEF и или GHI

2. @rdavis, затем вы можете использовать read_csv для импорта вашего CSV-файла и сначала преобразовать в dataframe.