【问题标题】:loop in loop creating a vector in R循环循环在R中创建一个向量
【发布时间】:2016-09-15 11:08:07
【问题描述】:

我想使用名称和数字创建一个向量。

我有 2 组:A 和 B。 我有两种性别:男性和女性 我有两种动物:狗和猫

而不是写一个包含每个组名称的向量:

vector= c("Amaledog","Afemaledog","Amalecat","Afemalecat","Bmaledog","Bfemaledog","Bmalecat","Bfemalecat")

我想在循环中使用循环:

group=c("A","B")
gender=c("female","male")
animal=c("dog","cat")

for (a in group){
 for (b in gender){
  for (c in animal){
   vector=paste0(a,b,c)
  }
 }
}

但我只获得: “黑猫”

你知道为什么吗?我该如何解决这个问题?

【问题讨论】:

  • 如果对您有用,请将以下答案之一标记为正确。

标签: r loops vector


【解决方案1】:

你可以使用expand.grid

expand.grid(group=c("A","B"),gender=c("female","male"),animal=c("dog","cat"))

输出:

  group gender animal
1     A female    dog
2     B female    dog
3     A   male    dog
4     B   male    dog
5     A female    cat
6     B female    cat
7     A   male    cat
8     B   male    cat

编辑:

do.call(paste0, expand.grid(group=c("A","B"),gender=c("female","male"),animal=c("dog","cat")))

正如 cmets 中指出的那样,应该这样做。

【讨论】:

  • do.call(paste0, expand.grid(group, gender, animal))
  • 谢谢你的回答。我想要一个包含名称而不是数据的向量:)
  • 使用罗兰的建议编辑了答案
【解决方案2】:

您每次都覆盖vector,这就是问题所在。你可能想要做的是

vect <- character(length(group) * length(gender) * length(animal))

i <- 1
for (a in group){
  for (b in gender){
    for (c in animal){
      vect[i] <- paste0(a,b,c)
      i <- i + 1
    }
  }
}

预先分配向量很重要,以避免大量(低效)重新分配。您最好使用矢量化解决方案。

【讨论】:

  • 感觉像是破纪录:“不要在循环中增长对象。至少预先分配到最终大小。” vect &lt;- character(length(group) * length(gender) * length(animal))
  • @Roland 这正是我告诉自己的
  • 感谢 Eli Korvigo 和 Roland 的回答。它对我有用。祝你有美好的一天。
【解决方案3】:

这是一个使用 data.table 与交叉连接 (CJ) 的选项

library(data.table)
CJ(group, gender, animal)[, do.call(paste0, .SD)]
#[1] "Afemalecat" "Afemaledog" "Amalecat"   "Amaledog"   "Bfemalecat"
#[6] "Bfemaledog" "Bmalecat"   "Bmaledog"  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多