根据另一列的因子水平创建新列
Create a new column based on factor levels of another column
我正在尝试在我的数据框中生成一个列,假设它被称为 'Status',它应该提供鱼的状态,即受保护或未受保护。
我要找的是:
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 个观察值。他们的一行代码可以link特定物种在新列中的状态。
我有 40 多个物种,其中 7 个受到保护。我希望为这 7 个物种提供 'Protected' 状态并忽略其他所有 'Unprotected' 而不是输入所有物种名称并将它们归类为 'Unprotected'
如有任何指点或建议,我们将不胜感激。我的技能是基本的,试图回到 R。我一直在使用 mutate 和 filter 涉足 dplyr,但我遇到了困难。
如果您只是想知道如何对数据框进行子集化,以便只有值为 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 <- filter(fishydata, Status == "Protected")
。我建议不要在 fishydata
中创建一个仅包含具有受保护状态的物种的新列。您的数据框中已经有了所有这些信息。如果您只想查看物种名称,可以使用 protected_fish$Species
将其提取为向量,或者使用 filter(fishydata, Status == "Protected") %>% select(Species)
等管道命令
没有状态列的数据:
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
您只需创建一个默认状态为未保护状态的新列:
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
我正在尝试在我的数据框中生成一个列,假设它被称为 'Status',它应该提供鱼的状态,即受保护或未受保护。
我要找的是:
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 个观察值。他们的一行代码可以link特定物种在新列中的状态。
我有 40 多个物种,其中 7 个受到保护。我希望为这 7 个物种提供 'Protected' 状态并忽略其他所有 'Unprotected' 而不是输入所有物种名称并将它们归类为 'Unprotected'
如有任何指点或建议,我们将不胜感激。我的技能是基本的,试图回到 R。我一直在使用 mutate 和 filter 涉足 dplyr,但我遇到了困难。
如果您只是想知道如何对数据框进行子集化,以便只有值为 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 <- filter(fishydata, Status == "Protected")
。我建议不要在 fishydata
中创建一个仅包含具有受保护状态的物种的新列。您的数据框中已经有了所有这些信息。如果您只想查看物种名称,可以使用 protected_fish$Species
将其提取为向量,或者使用 filter(fishydata, Status == "Protected") %>% select(Species)
没有状态列的数据:
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
您只需创建一个默认状态为未保护状态的新列:
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