【发布时间】:2020-03-31 16:43:47
【问题描述】:
我在 R 中有一个现有数据集,我希望在其中使用现有列构建一个新的数值列。它具有“远”、“近”、“开”等因素,我试图在“dplyr”(或类似的)中使用“变异”来创建一个具有相应数字的新列(远 = 3,近 = 2 , 开 = 1)。抱歉没有代码,我是这个论坛的新手。谢谢!
【问题讨论】:
我在 R 中有一个现有数据集,我希望在其中使用现有列构建一个新的数值列。它具有“远”、“近”、“开”等因素,我试图在“dplyr”(或类似的)中使用“变异”来创建一个具有相应数字的新列(远 = 3,近 = 2 , 开 = 1)。抱歉没有代码,我是这个论坛的新手。谢谢!
【问题讨论】:
首先是一个示例数据集。
set.seed(1234)
x <- factor(sample(c("Far", "Near", "On"), 10, TRUE))
首先,按照所需顺序重新编码因子及其水平。
codes <- c("Far" = 3, "Near" = 2, "On" = 1)
x <- factor(as.character(x), levels = names(sort(codes)))
现在,由于因子在内部被编码为连续整数,所以一个简单的强制就足够了。
as.integer(x)
#[1] 2 2 3 1 3 3 2 2 1 2
另一种选择是
attributes(x) <- NULL
x
#[1] 2 2 3 1 3 3 2 2 1 2
【讨论】:
您可以简单地设置因子列的级别
> # Initial data
> val
[1] Far Near On Far Near
Levels: Far Near On
> # Check the levels
> levels(val)
[1] "Far" "Near" "On"
> # Set levels to required values
> levels(val) <- c(3, 2, 1)
> # Result
> val
[1] 3 2 1 3 2
Levels: 3 2 1
【讨论】:
val 列(不是数字)执行数学运算,请谨慎使用此解决方案。尝试做val + 1。你会得到 NA NA NA。
另一个选项是unclass 因子并从 4 中减去结果,因为因子水平从 1L 开始。
x <- factor(c("Far","Near","On"))
4 - c(unclass(x))
# [1] 3 2 1
或者为了保留levels属性,省略c。
4 - unclass(x) -> y
class(y)
# [1] "numeric"
【讨论】:
dplyr 函数 case_when 可以在 mutate 内工作:
your_data <- your_data %>%
mutate(num = case_when(your_factor == "Far" ~ 3,
your_factor == "Near" ~ 2,
your_factor == "On" ~ 1))
编辑,演示这确实有效:
> your_data <- data.frame(your_factor = sample(c("Far", "Near", "On"), 10, TRUE))
> glimpse(your_data)
Observations: 10
Variables: 1
$ your_factor <fct> On, Far, Near, Far, Near, Near, On, On, On, On
> your_data <- your_data %>%
+ mutate(num = case_when(your_factor == "Far" ~ 3,
+ your_factor == "Near" ~ 2,
+ your_factor == "On" ~ 1))
> glimpse(your_data)
Observations: 10
Variables: 2
$ your_factor <fct> On, Far, Near, Far, Near, Near, On, On, On, On
$ num <dbl> 1, 3, 2, 3, 2, 2, 1, 1, 1, 1
>
【讨论】: