请求协助修正拼接字符串向量与数值向量的R程序代码
问题分析与解决方案
首先咱们来看你当前代码的问题所在:
你的代码是rep(paste(c("Apple", "Orange", "Peach"), c(1,2), sep='.'), each=2),其中paste这一步因为两个输入向量长度不匹配(3个水果 vs 2个数字),R会自动对短向量做循环补全,所以实际生成的是c("Apple.1", "Orange.2", "Peach.1"),之后用rep(..., each=2)只是把这三个元素各自重复两次,自然得不到你想要的序列。
接下来给你几个简单的正确实现方法,任选其一都可以:
方法一:用rep配合paste(最直观)
先让水果向量重复数字的次数,同时让每个数字重复水果的个数,再把两者拼接:
fruits <- c("Apple", "Orange", "Peach") nums <- c(1, 2) paste(rep(fruits, length(nums)), rep(nums, each = length(fruits)), sep = ".")
解释:
rep(fruits, length(nums))生成:Apple, Orange, Peach, Apple, Orange, Peachrep(nums, each = length(fruits))生成:1, 1, 1, 2, 2, 2- 两者一一对应拼接,正好得到你要的序列。
方法二:用expand.grid生成所有组合
expand.grid可以生成两个向量的所有笛卡尔积组合,再拼接成字符串:
fruits <- c("Apple", "Orange", "Peach") nums <- c(1, 2) combos <- expand.grid(Fruit = fruits, Num = nums) paste(combos$Fruit, combos$Num, sep = ".")
解释:expand.grid会生成一个数据框,包含所有水果和数字的组合,默认的顺序正好符合你的需求,直接拼接即可。
方法三:用outer函数(简洁高效)
outer可以对两个向量的所有元素对执行操作,再转成向量:
fruits <- c("Apple", "Orange", "Peach") nums <- c(1, 2) as.vector(outer(fruits, nums, paste, sep = "."))
解释:outer会生成一个矩阵,每行是一个水果与所有数字的组合,由于R中矩阵转向量是列优先的,所以转成向量后正好是你要的顺序:Apple.1, Orange.1, Peach.1, Apple.2, Orange.2, Peach.2。
内容的提问来源于stack exchange,提问作者user9524350
相关产品推荐
相关产品推荐

