相关疑难解决方法(0)

如何更改data.table中因子列的级别

更改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)

r data.table

48
推荐指数
3
解决办法
7万
查看次数

`level`上的`setattr`保留不需要的重复项(R data.table)

关键问题:使用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)

r duplicate-removal data.table

5
推荐指数
1
解决办法
699
查看次数

为什么在`j`中评估比在`data.table`中使用`$`更快?

也许这已经回答了,我错过了,但很难搜索.

一个非常简单的问题:为什么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可以吐出一些直方图,那将是很好的).

为什么会这样?

r data.table

4
推荐指数
1
解决办法
137
查看次数

R:使用数据表重新排序因子级别(用于Plotly)

TL;博士

是否可以通过引用重新排序数据表中列的因子级别?据我所知,不是现有的答案:

  • 这有效,但不是通过引用(链接):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)

r plotly data.table

4
推荐指数
1
解决办法
2850
查看次数

标签 统计

data.table ×4

r ×4

duplicate-removal ×1

plotly ×1