【问题标题】:conditionnal filling of a data table with the column names使用列名有条件地填充数据表
【发布时间】:2020-05-08 08:39:37
【问题描述】:

你好,我想这个问题对于 R 专家来说很容易。我需要用列名填充数据表。填充取决于另一个列条件。示例:

library(data.table)
dt <- data.table(V1=1:12, V2=c(1L,0L), V3=c(0L,1L,0L))

我要获取的表格是:

感谢您的帮助

【问题讨论】:

  • 您不应该在数据级别(即数据库本身)执行此操作吗?只需测试字段 (CASE [v2] WHEN 1 THEN 'v2' ELSE 'NA' END AS [V2.twin]) 中的值。那么,我怀疑您只需要一个字段,因为可以将其压缩为“v2”或“v3”并省略“NA”。但是,从技术上讲,您可以只测试字段本身的值。您的要求似乎有点不稳定。
  • 非常感谢 Paul 的回答和反应。不幸的是,我不能直接更改数据库中的值。
  • 不用担心。不过,在您的问题中可能值得一提(您可以做什么的限制)。祝你好运。 :o)

标签: r data.table conditional-statements


【解决方案1】:

一些选项:

1) 使用for:

cols <- c("V2", "V3")
for (x in cols)
    set(dt, dt[get(x)==1L, which=TRUE], paste0(x,".twin"), x)

2) 在通过引用更新之前在i 中进行子集化

for (x in cols)
    dt[get(x)==1L, paste0(x,".twin") := x]

3) 索引向量

cols <- c("V2", "V3")
dt[, paste0(cols, ".twin") := Map(function(x, nm) c(NA_character_, nm)[x+1L], .SD, cols), .SDcols=cols]

4) 使用ifelse

dt[, paste0(cols, ".twin") := Map(function(x, nm) fifelse(x==1L, nm, NA_character_), .SD, cols), .SDcols=cols]

输出:

    V1 V2 V3 V2.twin V3.twin
 1:  1  1  0      V2    <NA>
 2:  2  0  1    <NA>      V3
 3:  3  1  0      V2    <NA>
 4:  4  0  0    <NA>    <NA>
 5:  5  1  1      V2      V3
 6:  6  0  0    <NA>    <NA>
 7:  7  1  0      V2    <NA>
 8:  8  0  1    <NA>      V3
 9:  9  1  0      V2    <NA>
10: 10  0  0    <NA>    <NA>
11: 11  1  1      V2      V3
12: 12  0  0    <NA>    <NA>

【讨论】:

  • 即将发布与 4) 几乎相同的解决方案
  • 非常感谢 Chinsoon 的回答和反应。这正是我需要的解决方案。他们都工作。 3号我真的不容易。为什么是 x+1 ?
  • c(0L, 1L) + 1L = c(1L, 2L) 并且RHS用于访问c(NA, "V")的元素
猜你喜欢
  • 1970-01-01
  • 2023-03-21
  • 2020-08-11
  • 2014-03-10
  • 2017-01-08
  • 1970-01-01
  • 2017-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多