【问题标题】:in R: Using loop to let one column equal a list of names dependent on a list of names in another column in R在R中:使用循环让一列等于一个名称列表,该列表依赖于R中另一列中的名称列表
【发布时间】:2016-09-12 12:54:46
【问题描述】:

我是循环的新手 - 实际上,我不了解它们,并且通常会尝试寻找更简单的替代方案。这里我有一个简单的数据集:

spp = c("A", "B", "C", "A", "D","D")
Genus = as.vector(rep(1,6))
df = data.frame(cbind(spp,Genus), stringsAsFactors=FALSE)

我想根据“spp”列的内容,用特定的属名替换“属”列中的任何内容。这就是我所做的:

df$Genus[(df$spp == "A")] = "Apple"
df$Genus[(df$spp == "B")] = "Bla"
df$Genus[(df$spp == "C")] = "Cat"
df$Genus[(df$spp == "D")] = "Donkey"

虽然它返回所需的结果,但我正在寻找一种无需重复自己就可以循环此函数的方法?我的尝试涉及尝试在各种ifforapply 函数中使用levels(df$spp),但都失败了并且返回了我不理解的错误。我看过的所有基本循环示例都只使用了非常简单的函数,但我不知道如何将循环应用于具有两部分的稍微复杂的函数,如上所述?任何建议将不胜感激!

弗朗索瓦

【问题讨论】:

  • 使用带有命名向量的查找表。这是一个工作示例。 lookup <- c("A"="Apple", "B"="Bla", "C"="Cat", "D"="Donkey"); df$Genus <- lookup[match(df$spp, names(lookup))].

标签: r loops replace apply factors


【解决方案1】:

您可以尝试使用 switch() 声明 lapply

df$Genus <- lapply(df$spp, switch, "A"="Apple", "B"="Bla", "C"="Cat", "D"="Donkey")

df
# spp  Genus
#   A  Apple
#   B    Bla
#   C    Cat
#   A  Apple
#   D Donkey
#   D Donkey

lapply 将以递归方式运行,评估spp 的值,并将该值与表达式中的关联值切换出来,并将其分配给Genus 列。

【讨论】:

  • 非常感谢丹,这非常简单有效
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-13
  • 2021-11-29
  • 1970-01-01
  • 2011-10-02
  • 1970-01-01
相关资源
最近更新 更多