【问题标题】:Data table assignment not working数据表分配不起作用
【发布时间】:2015-05-02 09:16:33
【问题描述】:

好的,所以我正在清理一个大型数据集并尝试通过将数据帧代码更改为数据表来加快速度。我在对缺失值代码进行条件分配时遇到问题。玩具示例:

    X = data.table(grp=c("a","a","b","b","b","c","c","d","d","d","d"), 
    foo=c(1:4,NA,6:7,NA,8:10))
    setkey(X,grp)
    err.code <-"1111"
    row.select <- row.names(X)[X$grp=="b" & is.na(X$foo)]

    # Replace missing value for group b with err.code
    X[row.select, foo:=err.code]

所以我想将 err.code 放入符合条件的特定单元格中。然而,上面没有分配任何东西。例如

    > X
        grp foo
     1:   a   1
     2:   a   2
     3:   b   3
     4:   b   4
     5:   b  NA
     6:   c   6
     7:   c   7
     8:   d  NA
     9:   d   8
    10:   d   9
    11:   d  10

我在这里错过了什么?

【问题讨论】:

  • 这对我有用:X[grp == "b" &amp; is.na(foo), foo := 1111]....

标签: r data.table variable-assignment


【解决方案1】:

我看到了两个问题:

  1. 您试图用字符替换数字列中的值。 data.table 不喜欢这样,除非您显式转换列类型以相互匹配。
  2. 您正在尝试按字符值“5”而不是数值 5 来索引行。

因此,以下应该可以工作:

err.code <- 1111
row.select <- as.numeric(row.names(X)[X$grp=="b" & is.na(X$foo)])
X[row.select, foo := err.code][]
#     grp  foo
#  1:   a    1
#  2:   a    2
#  3:   b    3
#  4:   b    4
#  5:   b 1111
#  6:   c    6
#  7:   c    7
#  8:   d   NA
#  9:   d    8
# 10:   d    9
# 11:   d   10

或者,不创建那些额外的变量:

X[grp == "b" & is.na(foo), foo := 1111]

如果您认为不同的列类型会成为问题,您需要先显式转换它们:

err.code <- "1111"
row.select <- as.numeric(row.names(X)[X$grp=="b" & is.na(X$foo)])
X[, foo := as.character(foo)][row.select, foo := err.code][]
#     grp  foo
#  1:   a    1
#  2:   a    2
#  3:   b    3
#  4:   b    4
#  5:   b 1111
#  6:   c    6
#  7:   c    7
#  8:   d   NA
#  9:   d    8
# 10:   d    9
# 11:   d   10
str(.Last.value)
# Classes ‘data.table’ and 'data.frame':    11 obs. of  2 variables:
# $ grp: chr  "a" "a" "b" "b" ...
# $ foo: chr  "1" "2" "3" "4" ...
# - attr(*, ".internal.selfref")=<externalptr> 
# - attr(*, "sorted")= chr "grp"

【讨论】:

  • 嗯,row.select 的原因是因为在实时代码中还有很多事情要做,动态列等。所以我在它仍然是 data.frame 的时候进行行选择。它对我来说太复杂了,无法为数据表编写代码。为什么 row.select 是 numeric 很重要? `X[row.select,]' 选择相同的行,无论它是否为数字。同样在实时代码中,这些列是动态的并且属于不同的类 - 但我认为它们都是字符
  • 好吧,只需让 row.select 数字解决问题,但现在我遇到了新问题,因为列是不同的类等。我认为这比现在更麻烦。不过谢谢!
  • @user2498193,您可以在选择过程中添加转换。
猜你喜欢
  • 2018-03-28
  • 2016-01-11
  • 2017-10-27
  • 2012-12-05
  • 2015-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多