更改a中factor列的级别的正确方法是什么data.table (注意:不是数据框)
library(data.table)
mydt <- data.table(id=1:6, value=as.factor(c("A", "A", "B", "B", "B", "C")), key="id")
mydt[, levels(value)]
[1] "A" "B" "C"
Run Code Online (Sandbox Code Playgroud)
我正在寻找类似的东西:
mydt[, levels(value) <- c("X", "Y", "Z")]
Run Code Online (Sandbox Code Playgroud)
但是,当然,上述行不起作用.
# Actual # Expected result
> mydt > mydt
id value id value
1: 1 A 1: 1 X
2: 2 A 2: 2 X
3: 3 B 3: 3 Y
4: 4 B 4: 4 Y
5: 5 B 5: 5 Y
6: 6 C 6: 6 Z
Run Code Online (Sandbox Code Playgroud) 关键问题:使用setattr更改级别名称,保留不需要的重复项.
我正在清理一些数据,其中我有sevearl因子水平,所有这些都是相同的,显示为两个或更多不同的水平.(此错误主要是由于拼写错误和文件编码问题)我有153K因素,需要更正5%.
例
在以下示例中,向量具有三个级别,其中两个级别需要折叠为一个级别.
incorrect <- factor(c("AOB", "QTX", "A_B")) # this is how the data were entered
correct <- factor(c("AOB", "QTX", "AOB")) # this is how the data *should* be
> incorrect
[1] AOB QTX A_B
Levels: A_B AOB QTX <~~ Note that "A_B" should be "AOB"
> correct
[1] AOB QTX AOB
Levels: AOB QTX
Run Code Online (Sandbox Code Playgroud)
向量是a的一部分data.table.
使用该levels<-功能更改级别名称时,一切正常.
但是,如果使用setattr,则会保留不需要的重复项.
mydt1 <- data.table(id=1:3, incorrect, key="id")
mydt2 <- data.table(id=1:3, incorrect, key="id")
# assigning levels, …Run Code Online (Sandbox Code Playgroud) 也许这已经回答了,我错过了,但很难搜索.
一个非常简单的问题:为什么dt[,x]通常比一点点快dt$x?
例:
dt<-data.table(id=1:1e7,var=rnorm(1e6))
test<-microbenchmark(times=100L,
dt[sample(1e7,size=200000),var],
dt[sample(1e7,size=200000),]$var)
test[,"expr"]<-c("in j","$")
Unit: milliseconds
expr min lq mean median uq max neval
$ 14.28863 15.88779 18.84229 17.23109 18.41577 53.63473 100
in j 14.35916 15.97063 18.87265 17.99266 18.37939 54.19944 100
Run Code Online (Sandbox Code Playgroud)
我可能没有选择最好的例子,所以请随意提出一些可能更令人痛苦的事情.
无论如何,j在至少75%的时间内评估速度更快(尽管看起来有一个胖的上尾,因为平均值更高;旁注,如果microbenchmark可以吐出一些直方图,那将是很好的).
为什么会这样?
是否可以通过引用重新排序数据表中列的因子级别?据我所知,不是现有的答案:
table$x <- factor(table$x, levels = c("giraffes", "orangutans", "monkeys"))setattr(mydt$value,"levels",c(...))接受的答案使用:=符号提供了一种没有副作用的方法.
该问题的背景是需要重新排序Plotly中的条形图,该条形图规定了重新排序因子水平(链接).
我需要重新排序数据表框架中列的因子级别,我想以原生数据表的方式进行,如果有的话.我知道我可以用数据帧方式来做,但这需要硬编码的列名.我想使用动态列名,如果可能的话,通过引用更新.我找到了一种通过引用(链接)重新排序列的方法,但它不会相应地重新排序其他列,也不能使用动态列引用.
我有以下数据(人均二氧化碳排放量):
library(data.table)
print(data)
indicator country year value
1: EN.ATM.CO2E.PC Canada 2011 15.639760
2: EN.ATM.CO2E.PC China 2011 7.241515
3: EN.ATM.CO2E.PC European Union 2011 7.079374
4: EN.ATM.CO2E.PC India 2011 1.476686
5: EN.ATM.CO2E.PC Saudi Arabia 2011 17.702307
6: EN.ATM.CO2E.PC United States 2011 16.972417
class(data)
[1] "data.table" "data.frame"
print(str(lapply(data, class)))
List of 8
$ indicator : chr …Run Code Online (Sandbox Code Playgroud)