为 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:
使用 plyr
和 revalue
,这是一个更简单的实现,但可能比选项 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")
全部,
我有一个大数据集(超过 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:
使用 plyr
和 revalue
,这是一个更简单的实现,但可能比选项 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")