为 R 中的级别分配新值

Assign new values to levels in R

全部,

我有一个大数据集(超过 200 万行),在其中一列中我有以下级别:

"0"     "0.001" "1"     "4"     "4.001" "8.001"

我想创建一个新栏,其中每个栏都有一个新的对应字母:

0 = x,0.001 = D,1 = C,4 和 4.001 = B,8.001 = A

有没有一种方法可以在不使用包含 6 个 if 语句的 for 循环的情况下做到这一点?我试过了,运行.

花了很长时间

这是一个测试样本:

      a b
1 0.000 x
2 4.000 B
3 1.000 C
4 0.001 D
5 1.000 C
6 4.000 B
7 4.001 B
8 1.000 C
9 8.001 A

谢谢。

尝试as.factor (x, levels=c (任何级别和值用逗号分隔))

我不相信有一个单行命令可以为你做这件事。顺便说一句 for 循环本质上是低效的,不推荐用于大型数据集。

选项 1:
您可能想尝试的是 logical indexing,它是 bit array.

的统计实现
idx<- df$a == "0.000"
df$NewColumn[idx] <- "x"

idx<- df$a == "4.000"
df$NewColumn[idx] <- "B"

等等……

选项 2:
使用 plyrrevalue,这是一个更简单的实现,但可能比选项 1 的计算密集度更高。对于您的数据大小应该仍然很容易工作。

library(plyr)
df$NewColumn <- revalue(df$a, c(0 = "x", 0.001 = "D", 1 = "C", 4 = "B", 4.001 = "B", and 8.001 = "A"))

对于任一选项,请确保提供的数据类型 class 正确无误。从您的示例中,我很难判断数据是 factor 还是 numeric,但无论哪种方式,它都是在我的示例代码中进行管理的简单更改。

最简单的方法是创建一个 key/value 数据集并与原始数据合并

keyval <- data.frame(a = c(0, 0.001, 1, 4, 4.001, 8.001), 
     b = c('x', 'D', 'C', 'B', 'B', 'A'), stringsAsFactors= FALSE)
library(data.table)
setDT(df1)[keyval, b := b, on = .(a)]
df1
#       a b
#1: 0.000 x
#2: 4.000 B
#3: 1.000 C
#4: 0.001 D
#5: 1.000 C
#6: 4.000 B
#7: 4.001 B
#8: 1.000 C
#9: 8.001 A

数据

df1 <- structure(list(a = c(0, 4, 1, 0.001, 1, 4, 4.001, 1, 8.001)), 
    .Names = "a", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9"), class = "data.frame")

我会尝试这个,但不确定运行时间:

library(forcats)
df = data.frame(a = c("0", "0.001", "1", "4", "4.001", "8.001"))
df$b <- fct_recode(df$a,
               X = "0",
               D = "0.001",
               C = "1",
               B = "4",
               B = "4.001",
               A = "8.001")