作者celestialgod (天)
看板R_Language
标题Re: [问题] 利用文字向量做索引选取群组产生列表
时间Sat Feb 25 02:57:11 2017
※ 引述《Nonen (1800g)》之铭言:
: [问题类型]:
: 程式谘询(我想用R 做某件事情,但是我不知道要怎麽用R 写出来)
: [软体熟悉度]:
: 请把以下不需要的部份删除
: 新手(没写过程式,R 是我的第一次)
: [问题叙述]:
: 请简略描述你所要做的事情,或是这个程式的目的
: 我正在作一个能够回传有修高级车品牌的修车厂名字的程式,目前我已经有了372家修车
: 场的资料并整理出了两个向量。
: 向量一:只有修车厂名字
: 例如 c(甲,乙,丙,...)
: 向量二:车厂名字和有修的车子品牌 例如 c(甲,a,b,c,乙,b,f,g,丙,c,h,i,..)
: 然後假设高级车品牌有c(a,b,..),我想要找出任何有修高级车品牌的车厂
: 目前我卡在如何将向量二分成372家车厂的资料,因为每家会修的品牌数不一样无法使用
: 一定的间隔做切割
: 目前理想是可以做出一张list里面包含372个sublist且用店家名命名,每个sublist里有
: 该店家有修的车子品牌,再去看有哪些店家(回传sublist name)里有包含任一甚至更多高
: 级车品牌名单。还没有想到很好的解法,先谢谢大家了!
: [程式范例]:
: 车厂名单示意图(向量一)
: http://imgur.com/a/Awtuj
: 维修资讯示意图(向量二)
: http://imgur.com/a/zLqOi
: [环境叙述]:
: R version 3.3.1 (2016-06-21)
: Platform: x86_64-apple-darwin13.4.0 (64-bit)
: Running under: OS X 10.11.3 (El Capitan)
: [关键字]:
: 选择性,也许未来有用
图二看不到,我先根据你意思先生成资料
好读版:
http://pastebin.com/kgtr0RHX
# 生成资料的函数就比较复杂一点,需要一点时间研究
# 用到的就paste0, sprintf, replicate, sample, unlist, mapply这几个而已
# ?查一下应该不用太久时间就可以知道他们在干嘛了
# 至於要会用就要慢慢经验累积 try and error了
firms <- paste0("Firm", sprintf("%03i", 1L:500L))
brands <- paste0("Brand", sprintf("%03i", 1L:100L))
brandsList <- replicate(length(firms), sample(brands, sample(1L:20L, 1L)))
brandsFirms <- unlist(mapply(function(x, y) c(x, y), firms, brandsList,
USE.NAMES = FALSE))
head(brandsFirms, 24L)
# [1] "Firm001" "Brand046" "Brand024" "Brand021" "Brand050" "Brand011"
# [7] "Brand078" "Brand003" "Brand061" "Brand016" "Brand085" "Brand057"
# [13] "Firm002" "Brand006" "Brand072" "Brand024" "Brand057" "Brand083"
# [18] "Brand082" "Brand044" "Brand099" "Brand075" "Firm003" "Brand058"
# 所以firms1是你的vector 1,brandsFirms是你的vector 2
# 下面使用的function都是base里面的,随便找本基本R书都有教
# match, findInterval, split等,没教那本书就可以丢了
# seq_along, head应该都不用特别教吧,自己把玩一下就会了~~~
loc <- match(firms, brandsFirms)
idx <- findInterval(seq_along(brandsFirms), loc)
idx_firms <- firms[idx]
idx_firms[loc] <- "firms"
output <- split(brandsFirms, idx_firms)
output$firms <- NULL
head(output, 3L)
# $Firm001
# [1] "Brand046" "Brand024" "Brand021" "Brand050" "Brand011" "Brand078"
# [7] "Brand003" "Brand061" "Brand016" "Brand085" "Brand057"
#
# $Firm002
# [1] "Brand006" "Brand072" "Brand024" "Brand057" "Brand083" "Brand082"
# [7] "Brand044" "Brand099" "Brand075"
#
# $Firm003
# [1] "Brand058" "Brand069" "Brand047"
测试看看吧,有问题再上来问
比较闲就上个颜色,资料preview用绿色,注解用黄色~~
一个小建议是以後资料可以直接贴上来
这样我可以直接手抓下来...
不然我就会生成虚拟资料,你实际case的资料就要自己再测试
--
R资料整理套件系列文:
magrittr #1LhSWhpH (R_Language) https://goo.gl/72l1m9
data.table #1LhW7Tvj (R_Language) https://goo.gl/PZa6Ue
dplyr(上.下) #1LhpJCfB,#1Lhw8b-s (R_Language) https://goo.gl/I5xX9b
tidyr #1Liqls1R (R_Language) https://goo.gl/i7yzAz
pipeR #1NXESRm5 (R_Language) https://goo.gl/zRUISx
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 118.170.44.139
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1487962634.A.F55.html
1F:推 locka: 感谢推! 想请问c大,1L:500L的L是甚麽意思?感觉是个基本的 02/25 09:44
2F:→ locka: 的东西但自己就是查不到@@ 02/25 09:44
整数跟浮点数的差异
typeof(1L) # integer
typeof(1) # double
3F:→ Nonen: 先谢谢您的回答,晚点我会补图和资料上来,并作测试,感恩~ 02/25 12:01
5F:→ Nonen: 感谢c大我用你的方法试成功了,资料的话我想不到别的方法贴 02/26 13:14
6F:→ Nonen: 上来,所以直接和大家分享程式码 02/26 13:14
※ 编辑: celestialgod (36.232.184.141), 03/05/2017 19:36:11