【问题标题】:data.table/data.frame rbind not working finedata.table/data.frame rbind 无法正常工作
【发布时间】:2016-09-22 18:57:58
【问题描述】:

我正在使用 data.table 1.9.6。这是一些简单的代码和输出:

df <- data.table(a=c(NA,NA,2,2),b=c(1,1,2,2))
nrow(df[is.na(a)]) + nrow(df[!is.na(a)])
# [1] 4
nrow(rbind(df[is.na(a)],df[!is.na(a)]))
# [1] 4
nrow(rbind(df[is.na(a),b := a],df[!is.na(a)]))
# [1] 6
rbind(df[is.na(a),b := a],df[!is.na(a)])
#     a  b
# 1: NA NA
# 2: NA NA
# 3:  2  2
# 4:  2  2
# 5:  2  2
# 6:  2  2
rbind(df[is.na(a),a := b],df[!is.na(a)])
#     a  b
# 1: NA NA
# 2: NA NA
# 3:  2  2
# 4:  2  2
# 5:  2  2
# 6:  2  2

基本上只是在is.na() 和!is.na() 之后的rbind 给了我很好的结果,但是一旦我尝试用其他列值rbind(df[is.na(a),a := b],df[!is.na(a)]) 替换列中的NA 值,就会出现问题。相当不合逻辑的rbind(df[is.na(a),b := a],df[!is.na(a)]) 也会中断。谁能解释我缺少什么或者这是一个错误?

为了让事情继续前进,我尝试了:

rbind(data.frame(df[is.na(a),a := b]),data.frame(df[!is.na(a)]))
#    a  b
# 1 NA NA
# 2 NA NA
# 3  2  2
# 4  2  2
# 5  2  2
# 6  2  2

所以即使在我将其转换为data.frame 之后这也不起作用。

【问题讨论】:

  • dt[condition, col := blah] 返回整个(现已修改)data.tabledt。这就是为什么你得到你所得到的。

标签: r dataframe data.table rbind


【解决方案1】:

问题是您使用:= 就地更新条件,但返回忽略条件的整个数据集。

要么使用此语法不就地更新:

rbind(df[is.na(a),.(a,b = a)],df[!is.na(a)])
    a  b
1: NA NA
2: NA NA
3:  2  2
4:  2  2

或者这个只更新就地

df[is.na(a),b := a]
df
    a  b
1: NA NA
2: NA NA
3:  2  2
4:  2  2

【讨论】:

  • 我会选择rbind(df[is.na(a)][, b := a], df[!is.na(a)])
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-01
  • 1970-01-01
  • 2016-09-01
  • 2012-07-11
  • 2018-04-08
  • 2017-04-20
  • 2018-10-02
相关资源
最近更新 更多