涉及因素的数据表分配

Posted

技术标签:

【中文标题】涉及因素的数据表分配【英文标题】:data.table assignment involving factors 【发布时间】:2013-07-06 11:49:15 【问题描述】:

我正在使用data.table (1.8.9) 和:= 运算符从另一个表中的值更新一个表中的值。要更新的表 (dt1) 具有许多因子列,而具有更新的表 (dt2) 具有相似的列,其值可能在另一个表中不存在。如果 dt2 中的列是字符,我会收到一条错误消息,但是当我分解它们时,我会得到不正确的值。

如何在不先将所有因子转换为字符的情况下更新表格?

这是一个简化的例子:

library(data.table)

set.seed(3957)

## Create some sample data
## Note column y is a factor
dt1<-data.table(x=1:10,y=factor(sample(letters,10)))
dt1

##      x y
##  1:  1 m
##  2:  2 z
##  3:  3 t
##  4:  4 b
##  5:  5 l
##  6:  6 a
##  7:  7 s
##  8:  8 y
##  9:  9 q
## 10: 10 i

setkey(dt1,x)

set.seed(9068)

## Create a second table that will be used to update the first one.
## Note column y is not a factor
dt2<-data.table(x=sample(1:10,5),y=sample(letters,5))
dt2

##    x y
## 1: 2 q
## 2: 7 k
## 3: 3 u
## 4: 6 n
## 5: 8 t

## Join the first and second tables on x and attempt to update column y
## where there is a match
dt1[dt2,y:=i.y]

## Error in `[.data.table`(dt1, dt2, `:=`(y, i.y)) : 
##   Type of RHS ('character') must match LHS ('integer'). To check and
## coerce would impact performance too much for the fastest cases. Either
## change the type of the target column, or coerce the RHS of := yourself
## (e.g. by using 1L instead of 1)

## Create a third table that is the same as the second, except y
## is also a factor
dt3<-copy(dt2)[,y:=factor(y)]

## Join the first and third tables on x and attempt to update column y
## where there is a match
dt1[dt3,y:=i.y]
dt1

##      x y
##  1:  1 m
##  2:  2 i
##  3:  3 m
##  4:  4 b
##  5:  5 l
##  6:  6 b
##  7:  7 a
##  8:  8 l
##  9:  9 q
## 10: 10 i

## No error message this time, but it is using the levels and not the labels
## from dt3.  For example, row 2 should be q but it is i.

data.table help file 的第 3 页说:

当 LHS 是因子列并且 RHS 是包含项目的字符向量时 因子水平缺失,新水平会自动 添加(通过引用,有效地),与基本方法不同。

这使得我尝试过的方法看起来应该有效,但显然我遗漏了一些东西。我想知道这是否与这个类似的问题有关:

rbindlist two data.tables where one has factor and other has character type for a column

【问题讨论】:

目前看来不可能。 【参考方案1】:

这里有一个解决方法:

dt1[dt2, z := i.y][!is.na(z), y := z][, z := NULL]

请注意,z 是一个字符列,第二个分配按预期工作,不确定为什么 OP 没有。

【讨论】:

非常感谢@eddi 提供的解决方法。我暂时不回答这个问题,希望有人能提出标准语法似乎不起作用的原因。

以上是关于涉及因素的数据表分配的主要内容,如果未能解决你的问题,请参考以下文章

R语言—方差分析

0304.数据仓库实施步骤与关键因素

输入/输出(I/O)管理-第一节6:设备的分配和回收

影响MySQL性能因素有哪些?

精简的Linux以及从系统的角度分析影响程序执行性能的因素

Android代码优化小技巧