Вытащите только две переменные из столбца - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть кадр данных в 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

Ответы [ 2 ]

0 голосов
/ 09 апреля 2019

Помимо ответа Тима, если вы хотите выполнить все 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
0 голосов
/ 09 апреля 2019

Для базового решения R мы можем попытаться использовать lapply вместе с 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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...