簡體   English   中英

根據另一列的因子級別創建新列

[英]Create a new column based on factor levels of another column

我正在嘗試在我的數據框中生成一個列,讓我們說它被稱為“狀態”,它應該提供魚的狀態,即受保護或不受保護。

我在找什么:

  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.我一直在使用變異和過濾器涉及dplyr,但我已經到了一堵磚牆。

沒有狀態列的數據:

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

如果您只是想知道如何對數據框進行子集化以便您只擁有值為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中創建一個新列,其中只包含具有受保護狀態的物種。 您已經擁有數據框中的所有信息。 如果您只想查看Species名稱,可以將其作為帶有protected_fish$Species的向量提取,或者使用像filter(fishydata, Status == "Protected") %>% select(Species)這樣的管道命令filter(fishydata, Status == "Protected") %>% select(Species)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM