【问题标题】:Create a new column based on factor levels of another column根据另一列的因子水平创建新列
【发布时间】:2018-03-05 13:49:34
【问题描述】:

我正在尝试在我的数据框中生成一个列,假设它称为“状态”,它应该提供鱼的状态,即受保护或不受保护。

我在寻找什么:

  ID                   Species      Status
1  1 Epinephelus polyphekadion   Protected
2  2        Epinephelus tukula   Protected
3  3         Thunnus albacares   Protected
4  4       Sphyraena barracuda Unprotected
5  5        Lutjanus rivulatus Unprotected
6  6         Lethrinus lentjan Unprotected
7  7 Plectropomus pessuliferus   Protected

我的数据:

fishydata <- structure(list(ID = 1:7, Species = structure(c(1L, 2L, 7L, 6L,4L, 3L, 5L), .Label = c("Epinephelus polyphekadion", "Epinephelus tukula","Lethrinus lentjan", "Lutjanus rivulatus", "Plectropomus pessuliferus","Sphyraena barracuda", "Thunnus albacares"), class = "factor"), .Names = c("ID", "Species"), row.names = c(NA, 7L), class = "data.frame")

数据集包含超过 1000 个观测值。它们是一行代码,可以将特定物种与新列中的状态联系起来。

我有 40 多个物种,其中 7 个受到保护。我希望为这 7 个物种提供“受保护”状态,并将其他所有内容都视为“不受保护”,而不是输入所有物种名称并将它们归类为“不受保护”

任何指针或建议将不胜感激。我的技能是基本的,试图回到 R。我一直在使用 mutate 和 filter 涉足 dplyr,但我已经到达了一堵砖墙。

【问题讨论】:

  • 你能澄清你的输入是什么吗?您的数据似乎已经具有您正在寻找的因素..
  • 如果您有受保护物种的查找表,则可以使用 join。
  • @DanHall 抱歉,我将更新并删除受保护的列。 Cédric Miachon 的答案是我正在努力实现的目标,也许在一个班轮中是可能的。

标签: r grouping levels dplyr


【解决方案1】:

您的数据没有状态栏:

fishydata2 <- structure(list(ID = 1:7, 
                            Species = structure(c(1L, 2L, 7L, 6L,4L, 3L, 5L), 
                            .Label = c("Epinephelus polyphekadion", "Epinephelus tukula","Lethrinus lentjan", "Lutjanus rivulatus", "Plectropomus pessuliferus","Sphyraena barracuda", "Thunnus albacares"), class = "factor")
                        ),
                   .Names = c("ID", "Species"), 
                   row.names = c(NA, 7L), 
                   class = "data.frame")

#   ID                   Species
#1  1 Epinephelus polyphekadion
#2  2        Epinephelus tukula
#3  3         Thunnus albacares
#4  4       Sphyraena barracuda
#5  5        Lutjanus rivulatus
#6  6         Lethrinus lentjan
#7  7 Plectropomus pessuliferus

您只需创建一个默认状态为 Unprotected 的新列:

fishydata2$Status <- "Unprotected"

现在,只需为您仅有的 7 个受保护物种更新它:

fishydata2[fishydata2$Species %in% c('Epinephelus polyphekadion',
                  'Epinephelus tukula','Thunnus albacares',
                  'Plectropomus pessuliferus'),]$Status <- "Protected"

结果:

fishydata2
#ID                   Species      Status
#1  1 Epinephelus polyphekadion   Protected
#2  2        Epinephelus tukula   Protected
#3  3         Thunnus albacares   Protected
#4  4       Sphyraena barracuda Unprotected
#5  5        Lutjanus rivulatus Unprotected
#6  6         Lethrinus lentjan Unprotected
#7  7 Plectropomus pessuliferus   Protected

【讨论】:

  • 就这样。这是一种解决方法还是实现这一目标的标准方法。非常感谢您的快速答复。
  • 是否有一种可能的方法可以将“作弊”和“Epinephelus”类放在一起,而不是写出每个物种的名称,即 E.tukula E.polyphekadion .... 抱歉,如果这构成另一个问题,我如果是这样,将发布。 B
  • 因为只有少数物种,我会说这是实现这一目标的标准方法。
  • @Beaver 对于您的第二个问题,最好的方法是在属(即 Epinephelus)上有一个专门的专栏,在物种上有另一个专栏。如果不可能,您可以在这里查看:stackoverflow.com/questions/5823503/…
  • 感谢@Cédric Miachon 我发现将“未受保护”设置为状态列的默认值存在问题。如果数据框中的一行没有捕获到鱼并且物种列为空 = 状态列将显示“未受保护”表示没有鱼。 NA 会更正确。
【解决方案2】:

如果您只是想知道如何对数据框进行子集化,以便只获得值为 Protected 的行,这里有两个选项:

使用 dplyr

filter(fishydata, Status == "Protected")
#   ID                   Species    Status
# 1  1 Epinephelus polyphekadion Protected
# 2  2        Epinephelus tukula Protected
# 3  3         Thunnus albacares Protected
# 4  7 Plectropomus pessuliferus Protected

基础

fishydata[fishydata$Status == "Protected",]
#   ID                   Species    Status
# 1  1 Epinephelus polyphekadion Protected
# 2  2        Epinephelus tukula Protected
# 3  3         Thunnus albacares Protected
# 7  7 Plectropomus pessuliferus Protected

这两个选项都将生成一个数据框,其中仅包含与受保护物种相对应的那些行。如果您想稍后使用它,可以将其分配给protected_fish,例如protected_fish &lt;- filter(fishydata, Status == "Protected")。我建议不要在fishydata 中创建仅包含受保护物种的新列。您已经在数据框中拥有所有这些信息。如果您只想查看物种名称,可以使用protected_fish$Species 将其提取为向量,或使用filter(fishydata, Status == "Protected") %&gt;% select(Species) 等管道命令

【讨论】:

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