#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.