单独将一列拆分为多个

时间:2020-10-18 20:27:36

标签: r

我想基于字符串索引将glazingMaterial.AddToOsm(model)列分为3列(称为“ A”,“ B”,“ C”)。第一列只报告项目1,第二列T,最后一列4:7。

ID

我已经定义了向量,其字符串位置如下所示

2:3

我正在尝试将定义的向量用于单独的函数中

    ID     Data
mw21e10     878         
mw61e10     908          
mw61e10    1073  

2 个答案:

答案 0 :(得分:1)

我们可以基于'a','b'向量使用substring,然后使用unnest_widerlist列更改为三列

library(dplyr)
library(tidyr)
mydata %>%
   rowwise %>% 
   mutate(new = list(substring(ID, a, b))) %>%
   ungroup %>% 
   unnest_wider(c(new), names_repair = ~c(names(mydata), 'A', 'B', 'C'))

-输出

# A tibble: 3 x 5
#  ID       Data A     B     C    
#  <chr>   <int> <chr> <chr> <chr>
#1 mw21e10   878 m     w2    1e10 
#2 mw61e10   908 m     w6    1e10 
#3 mw61e10  1073 m     w6    1e10 

或者,如果我们需要使用separate,请确保仅指定分割位置,而不是两个向量的范围。根据{{​​1}}的输出,它位于位置1、3

substr

-输出

mydata %>% 
      separate(ID, into = c("A", "B", "C"), c(1, 3 ), remove = FALSE)

或将# ID A B C Data #1 mw21e10 m w2 1e10 878 #2 mw61e10 m w6 1e10 908 #3 mw61e10 m w6 1e10 1073 base R一起使用

Map

数据

mydata[c('A', 'B', 'C')] <- Map(substring, mydata$ID, 
                         MoreArgs = list(first = a, last = b))

答案 1 :(得分:0)

一个dplyrpurrr选项可以是:

df %>%
 bind_cols(map2_dfc(.x = c(1,2,4),
                    .y = c(1,3,7),
                    ~ df %>%
                     transmute(col = substr(ID, .x, .y))) %>%
            set_names(c("A", "B", "C")))

       ID Data A  B    C
1 mw21e10  878 m w2 1e10
2 mw61e10  908 m w6 1e10
3 mw61e10 1073 m w6 1e10