分隔不一致的分隔名称

时间:2019-12-01 13:45:22

标签: r text dplyr tidyr

我有一个这样的品牌数据集:

Brand = data.frame(Brand = c("Nike, Adidas", "Nike Shoes", "Nike, New Balance, etc.", "Adidas, Nike, Reebok, Reebok Nike"))

目标是在一列中获得每个独特的品牌名称。问题在于名称不是一致地分隔的(例如,某些名称之间用逗号分隔,另一些之间用空格分隔)。因此,尚不清楚是以空格分隔是两个品牌(例如Nike Adidas)之间还是品牌名称(例如New Balance)之间的分隔。有没有办法在R中做到这一点?现在,尝试以这种方式解决它:

library(tidyverse)

Brands %>%
  separate(Brand, into = c(LETTERS[(seq(1, 10))]), sep = ",") %>%
  select_if(~sum(!is.na(.)) > 0) 


          A            B       C            D
1       Nike       Adidas    <NA>         <NA>
2 Nike Shoes         <NA>    <NA>         <NA>
3       Nike  New Balance    etc.         <NA>
4     Adidas         Nike  Reebok  Reebok Nike

某些品牌不在其自己的列中(例如,耐克在D列中)。如果现在用空格将名称分开,则会遇到一些问题(例如鞋子或New Balance)。

2 个答案:

答案 0 :(得分:1)

一种方法是使用split.default拆分备用列,并在删除NA值后,使用每个组的第一列作为名称,第二列作为值来创建命名向量。

out <- lapply(split.default(weights, gl(ncol(weights)/2, 2)), function(x) {
   inds = !is.na(x[[2]])
   setNames(x[[2]][inds], x[[1]][inds])
})
names(out) <- names(weights)[c(TRUE, FALSE)]

#$RECAGE
#      1       2       3       4 
#0.12195 0.33841 0.35823 0.18140 

#$RECQ3
#      1       2       3       4 
#0.21325 0.24372 0.25057 0.29246 

#$Q3A
#        1         2         3         4         5         6         7 
#0.1327231 0.1617086 0.0480549 0.0259344 0.0076278 0.0274600 0.0785660 
#        8         9        10        11        12        13        14 
#0.0167811 0.0922960 0.2212052 0.0511060 0.0122044 0.0434783 0.0213577 
#       15        16 
#0.0358505 0.0236461 

#$Q5_1_REC
#       1        2        3        4 
#0.554116 0.205030 0.166921 0.073933 

#$Q5_2_REC
#      1       2       3       4 
#0.59237 0.13969 0.13206 0.13588 

答案 1 :(得分:1)

3 3 的一个选项,方法是使用循环逻辑向量对列进行子集设置

map2

我们还可以通过捕获名称中的模式并将其拆分为命名向量的library(purrr) library(dplyr) map2(weights[c(TRUE, FALSE)], weights[c(FALSE, TRUE)], ~ { i1 <- !is.na(.x) set_names(.y[i1], .x[i1]) }) #$RECAGE # 1 2 3 4 #0.1219512 0.3384146 0.3582317 0.1814024 #$RECQ3 # 1 2 3 4 #0.2132521 0.2437167 0.2505712 0.2924600 #$Q3A # 1 2 3 4 5 6 7 8 9 10 11 12 #0.132723112 0.161708619 0.048054920 0.025934401 0.007627765 0.027459954 0.078565980 0.016781083 0.092295957 0.221205187 0.051106026 0.012204424 # 13 14 15 16 #0.043478261 0.021357742 0.035850496 0.023646072 #$Q5_1_REC # 1 2 3 4 #0.55411585 0.20503049 0.16692073 0.07393293 #$Q5_2_REC # 1 2 3 4 #0.5923664 0.1396947 0.1320611 0.1358779 来以编程方式进行此操作

list