【问题标题】:Filter by column index number data.table R按列索引号 data.table R 过滤
【发布时间】:2021-07-23 15:12:46
【问题描述】:

有趣的是,我找不到使用列号进行过滤的方法。我不知道列的名称,因为它会更改名称,但我总是知道列的位置。

这看起来很简单,但似乎我只能使用列名引用 i 部分。

table = data.table(one = c(1,2,3), two = c("a","b","c"))

> table
   one two
1:   1   a
2:   2   b
3:   3   c

我不知道第二列是“二”。我只想按第二列过滤。

> table[two == "a"]
   one two
1:   1   a

更新:

正如 Ronak 所说,我可以使用

> table[table[[2]]=="a"]

   one two
1:   1   a

但是我接下来想更新同一列,例如我想将“a”变成“c”。

我需要什么:

> table
   one two
1:   1   c
2:   2   b
3:   3   c

我试过了:

> table[table[[2]]=="a", table[[2]]:= "c"]
> table
   one two    a    b    c
1:   1   a    c    c    c
2:   2   b <NA> <NA> <NA>
3:   3   c <NA> <NA> <NA>

所以看起来我正在获取第二列中的所有值并为它们创建新列,而不是仅仅将过滤后的行更改为 c。

> table[table[[2]]=="a", table[2]:= "c"]

Error in `[.data.table`(table, table[[2]] == "a", `:=`(table[2], "c")) : 
  LHS of := must be a symbol, or an atomic vector (column names or positions).

所以我想我需要知道第二列的位置。

【问题讨论】:

标签: r data.table


【解决方案1】:

使用[[ 有效:

library(data.table)

dt <- data.table(a = 1:5, b = 2:6)
dt[dt[[1]] == 1]

#   a b
#1: 1 2

这给出了与dt[a == 1] 相同的输出。

【讨论】:

  • 嗨罗纳克,谢谢。我已更新问题以添加我需要在同一列上执行操作。
  • @JantjeHouten 你可以使用table[table[[2]]=="a", (2) := "c"]
【解决方案2】:

我们知道我们需要第 2 列,获取第 2 列名称,并使用“变量作为列名称”,参见示例:

library(data.table)
d <- data.table(one = c(1,2,3), two = c("a","b","c"))

# get the 2nd column name
myCol <- colnames(d)[ 2 ]

# subset
d[ get(myCol) == "a", ]

# subset and update
d[ get(myCol) == "a", (myCol) := "c" ]

【讨论】:

    【解决方案3】:

    我们可以使用.SD

    dt[dt[, .SD[[1]] == 1]]
    #   a b
    #1: 1 2
    

    数据

    dt <- data.table(a = 1:5, b = 2:6)
    

    【讨论】:

      【解决方案4】:

      你也可以试试这个:

      table[[2]][table[[2]]=="a"] <- "c"
      table
      > table
         one two
      1:   1   c
      2:   2   b
      3:   3   c
      

      【讨论】:

        【解决方案5】:

        我想通了:

        > table[table[[2]]=="a", colnames(table)[2]:= "c"]
        > table
           one two
        1:   1   c
        2:   2   b
        3:   3   c
        

        谢谢!

        【讨论】:

          猜你喜欢
          • 2018-04-30
          • 2012-08-04
          • 2013-09-19
          • 1970-01-01
          • 2022-12-08
          • 2022-06-20
          • 1970-01-01
          • 2016-07-28
          相关资源
          最近更新 更多