Есть ли возможность сделать разделение столбцов? - PullRequest
0 голосов
/ 25 мая 2019

Необходимо видеть имена производителей по моделям автомобилей

примерно так: enter image description here

пытается использовать функцию ниже, но она создается в виде списка

strsplit(carz$maker,split = " ")

Ответы [ 3 ]

1 голос
/ 25 мая 2019

Вот подход, который использует lapply() с фреймом данных Motor Trend Cars.

data(mtcars)
mtcars$type <- rownames(mtcars)
mtcars$make <-unlist(lapply(strsplit(mtcars$type," "),function(x){x[[1]]}))
head(mtcars)

и результат:

> head(mtcars)
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
                               type    make
Mazda RX4                 Mazda RX4   Mazda
Mazda RX4 Wag         Mazda RX4 Wag   Mazda
Datsun 710               Datsun 710  Datsun
Hornet 4 Drive       Hornet 4 Drive  Hornet
Hornet Sportabout Hornet Sportabout  Hornet
Valiant                     Valiant Valiant
> 

Обратите внимание, что необходима некоторая дополнительная очистка данных, поскольку Valiant и Duster были изготовлены Plymouth, Camaro Z28 - Chevrolet, а Hornet 4 Drive - американской компанией Motor Cars, также известной как AMC.

Относительно вопроса в комментариях о синтаксисе, используемом в lapply(), я использовал lapply() для обработки результатов strsplit(), включая анонимную функцию , которая извлекает первое слово из каждого элемента из списка.

Поскольку выходные данные функции R могут использоваться в качестве аргумента другой функции, это решение объединяет функции для получения желаемого результата.

Ответ sapply(), предоставленный akrun, делает то же самое, используя вывод strsplit() в качестве входных данных и используя [, одну из четырех форм оператора извлечения для извлечения данных. sapply() также создает вектор, а не список в качестве вывода.

1 голос
/ 25 мая 2019

И, конечно, есть решение tidyverse;Вот для чего была разработана функция separate.

library(tidyverse)
mtcars %>% rownames_to_column("type") %>% 
  separate(type, c("make", "model"), 
           extra="merge", fill="right", remove=FALSE) 

Отображение выбора выхода:

                  type     make       model
1            Mazda RX4    Mazda         RX4
2        Mazda RX4 Wag    Mazda     RX4 Wag
3           Datsun 710   Datsun         710
4       Hornet 4 Drive   Hornet     4 Drive
5    Hornet Sportabout   Hornet  Sportabout
6              Valiant  Valiant        <NA>
7           Duster 360   Duster         360
8            Merc 240D     Merc        240D
9             Merc 230     Merc         230
10            Merc 280     Merc         280
0 голосов
/ 25 мая 2019

strsplit повторяет list, нам нужно перебрать list и извлечь первое слово, чтобы получить вектор

carz$maker <- sapply(strsplit(carz$maker,split = " "), `[`, 1)

Воспроизводимый с mtcars

sapply(strsplit(rownames(mtcars), " "), `[`, 1)
#[1] "Mazda"    "Mazda"    "Datsun"   "Hornet"   "Hornet"   "Valiant"  "Duster"   "Merc"     "Merc"     "Merc"     "Merc"    
#[12] "Merc"     "Merc"     "Merc"     "Cadillac" "Lincoln"  "Chrysler" "Fiat"     "Honda"    "Toyota"   "Toyota"   "Dodge"   
#[23] "AMC"      "Camaro"   "Pontiac"  "Fiat"     "Porsche"  "Lotus"    "Ford"     "Ferrari"  "Maserati" "Volvo"   

Это также можно сделать без strsplit

carz$maker <- sub("\\s+.*", row.names(carz))

или с word

library(stringr)
word(carz$maker, 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...