假設我有這個資料框
d = data.frame(x = c("1","1 2", "1 3", "2 3", "3", "4"))
d
它以變數 x 作為因子
d$x = as.factor(d$x)
然而,我在我寫的三個關卡中發現了一個錯誤。
所以我想替換這些變數的值及其級別,如下所示:
我想用 1 替換 1 2
我想用 1 替換 1 3
我想用 2 替換 2 3
levels(d$x)
所以我想糾正它。使用以下方法時:
d$x[which(d$x == "1 2")] <- "1"
d$x[which(d$x == "1 3")] <- "1"
d$x[which(d$x == "2 3")] <- "2"
它創建的級別如下
1 1 1 2 3 4
我希望的水平如下
1 2 3 4
我應該怎么做才能處理這個問題?謝謝
uj5u.com熱心網友回復:
另一種選擇是在修改時回傳字符:
d$x <- as.character(d$x)
d$x <- factor(sub(" . ", "", d$x))
d$x
# [1] 1 1 1 2 3 4
# Levels: 1 2 3 4
uj5u.com熱心網友回復:
您可以使用fct_collapse:
library(dplyr)
library(forcats)
d %>%
mutate(x = fct_collapse(x,
"1" = c("1", "1 2", "1 3"),
"2" = c("2", "2 3")))
x
1 1
2 1
3 1
4 2
5 3
6 4
uj5u.com熱心網友回復:
這個怎么樣?您按空格拆分文本,然后將串列取消嵌套為長格式。如果有很多問題,這將起作用。這還假設有一個空格根據您的示例定義錯誤。
library(tidyverse)
d <- data.frame(x = c("1","2", "3 4", "5", "6"))
d |>
mutate(x = str_split(x, pattern = "\\s")) |>
unnest_longer(x)
#> # A tibble: 6 x 1
#> x
#> <chr>
#> 1 1
#> 2 2
#> 3 3
#> 4 4
#> 5 5
#> 6 6
根據評論編輯:這里有兩種方法。一種tidyverse使用基數 R,另一種使用基數 R。
library(tidyverse)
d <- data.frame(x = c("1","2", "3 4", "5", "6"))
d |>
mutate(x = str_remove(x, "\\s4$"))
#> x
#> 1 1
#> 2 2
#> 3 3
#> 4 5
#> 5 6
d$x[which(d$x == "3 4")] <- "3"
d
#> x
#> 1 1
#> 2 2
#> 3 3
#> 4 5
#> 5 6
基于更多資訊的另一個編輯:
d = data.frame(x = c("1","1 2", "1 3", "2 3", "3", "4"))
d$x <- as.factor(gsub("(\\d )\\s\\d $", "\\1", d$x))
d
#> x
#> 1 1
#> 2 1
#> 3 1
#> 4 2
#> 5 3
#> 6 4
levels(d$x)
#> [1] "1" "2" "3" "4"
uj5u.com熱心網友回復:
recode()為此目的還有一個專用功能dplyr:
library(dplyr)
## initial factor
x <- factor(c("1","1 2", "1 3", "2 3", "3", "4"))
levels(x)
#> [1] "1" "1 2" "1 3" "2 3" "3" "4"
## edited factor
recode(x, "1 2" = "1", "1 3" = "1", "2 3" = "2")
#> [1] 1 1 1 2 3 4
#> Levels: 1 2 3 4
PS:您不應以使(以前有效)答案無效的方式編輯您的問題。
uj5u.com熱心網友回復:
復制我對最近一個問題的回答:
在底層,因子陣列是一個帶有標簽(級別)的整數陣列。您可以單獨重命名標簽,而無需觸及底層陣列。
d = data.frame(x = factor(c("1","1 2", "1 3", "2 3", "3", "4")))
levels(d$x)
[1] "1" "1 2" "1 3" "2 3" "3" "4"
levels(d$x) <- c(1, 1, 1, 2, 3, 4)
levels(d$x)
[1] "1" "2" "3" "4"
d$x
[1] 1 1 1 2 3 4
Levels: 1 2 3 4
如果您有更多級別,并且不想冒險手動分配,您可以創建一個替換值字典
d = data.frame(x = factor(c("1","1 2", "1 3", "2 3", "3", "4")))
dict <- setNames(
gsub(' .$', '', levels(d$x)), # remove spaces and any character after that
levels(d$x)
)
dict
1 1 2 1 3 2 3 3 4
"1" "1" "1" "2" "3" "4"
然后,您可以使用字典將現有級別標簽替換為新級別標簽
levels(d$x) <- dict[levels(d$x)]
d$x
[1] 1 1 1 2 3 4
Levels: 1 2 3 4
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/511271.html
標籤:r变量因素水平
