[英]Conditionally replace levels of factor variable 1 for a specific variable 2
在我的例子中:
# Packages
library(dplyr)
# My dataset
FARM <- c(rep("LIBERTY2",4),rep("OLDOAK",4))
AGE <- c(8,9,10,10,8,9,10,10)
Y = c(0,0,0,0,1,1,1,1)
DS_F <- data.frame(FARM=FARM,AGE=AGE,Y=Y)
str(DS_F)
# 'data.frame': 8 obs. of 3 variables:
# $ FARM: chr "LIBERTY2" "LIBERTY2" "LIBERTY2" "LIBERTY2" ...
# $ AGE : num 8 9 10 10 8 9 10 10
# $ Y : num 0 0 0 0 1 1 1 1
我想在變量FARM
中只LIBERTY2
因子進行條件變異,並在另一個變量中使用規則:如果AGE
等於 10 而不是 3,如果AGE
等於 9 而不是 2,如果AGE
等於 8 而不是 1。
My final output should be:
DS_F2
# FARM AGE Y
# 1 LIBERTY2 1 0
# 2 LIBERTY2 2 0
# 3 LIBERTY2 3 0
# 4 LIBERTY2 3 0
# 5 OLDOAK 8 1
# 6 OLDOAK 9 1
# 7 OLDOAK 10 1
# 8 OLDOAK 10 1
請幫我。
您可以將recode()
包圍到if_else()
中。
library(dplyr)
DS_F %>%
mutate(AGE.2 = if_else(FARM == "LIBERTY2",
recode(AGE, `10` = 3, `9` = 2, `8` = 1),
AGE))
# FARM AGE Y AGE.2
# 1 LIBERTY2 8 0 1
# 2 LIBERTY2 9 0 2
# 3 LIBERTY2 10 0 3
# 4 LIBERTY2 10 0 3
# 5 OLDOAK 8 1 8
# 6 OLDOAK 9 1 9
# 7 OLDOAK 10 1 10
# 8 OLDOAK 10 1 10
使用data.table
library(data.table)
setDT(DS_F)[FARM == "LIBERTY2", AGE := AGE - min(AGE)+1]
-輸出
> DS_F
FARM AGE Y
1: LIBERTY2 1 0
2: LIBERTY2 2 0
3: LIBERTY2 3 0
4: LIBERTY2 3 0
5: OLDOAK 8 1
6: OLDOAK 9 1
7: OLDOAK 10 1
8: OLDOAK 10 1
這是你想要的?
DS_F <- DS_F %>%
mutate(FARM = as.factor(FARM),
RULE = case_when(AGE == 10 ~ 3,
AGE == 9 ~ 2,
AGE == 8 ~ 1))
產生
> DS_F %>%
+ mutate(FARM = as.factor(FARM),
+ RULE = case_when(AGE == 10 ~ 3,
+ AGE == 9 ~ 2,
+ AGE == 8 ~ 1))
FARM AGE Y RULE
1 LIBERTY2 8 0 1
2 LIBERTY2 9 0 2
3 LIBERTY2 10 0 3
4 LIBERTY2 10 0 3
5 OLDOAK 8 1 1
6 OLDOAK 9 1 2
7 OLDOAK 10 1 3
8 OLDOAK 10 1 3
具有以下數據類型
> str(DS_F)
'data.frame': 8 obs. of 4 variables:
$ FARM: Factor w/ 2 levels "LIBERTY2","OLDOAK": 1 1 1 1 2 2 2 2
$ AGE : num 8 9 10 10 8 9 10 10
$ Y : num 0 0 0 0 1 1 1 1
$ RULE: num 1 2 3 3 1 2 3 3
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.