我有一个这样的品牌数据集:
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)。
答案 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