可以进行列拆分吗?

时间:2019-05-25 15:27:31

标签: r

需要对照汽车型号查看制造商名称

类似这样的东西: enter image description here

试图使用以下功能,但它是作为列表创建的

strsplit(carz$maker,split = " ")

3 个答案:

答案 0 :(得分:1)

这是一种将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是由American Motor Cars(也称为AMC)制造的,因此还需要进行其他一些数据清洁。

关于注释中关于lapply()中使用的语法的问题,我使用lapply()处理strsplit()的结果,包括提取第一个单词的anonymous function从列表的每个元素开始。

由于R函数的输出可用作另一个函数的参数,因此此解决方案嵌套函数以产生所需的结果。

akrun提供的sapply()答案做同样的事情,使用strsplit()的输出作为输入,并使用[(提取运算符的四种形式之一)提取数据。 sapply()还会产生一个向量而不是一个列表作为其输出。

答案 1 :(得分:1)

当然,还有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

答案 2 :(得分:0)

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)