【问题标题】:Create an summarizing variable for multiple columns in data.table r为 data.table r 中的多列创建汇总变量
【发布时间】:2020-11-27 06:03:09
【问题描述】:

我有以下data.table

dt <- data.table(id=c(1,2,2,2,3,3,4),
                 date=c("2019-09-13", "2018-12-06", "2017-12-14", "2018-02-08", "2015-12-06", "2012-12-14", "2011-02-08"),
                 variable_1=c("a","b",NA,NA,"b","c",NA),
                 variable_2=c(NA,NA,"a",NA,"a","c",NA),
                 variable_3=c(NA,NA,NA,"b","c","c",NA))
dt
id       date variable_1 variable_2 variable_3
1:  1 2019-09-13          a       <NA>       <NA>
2:  2 2018-12-06          b       <NA>       <NA>
3:  2 2017-12-14       <NA>          a       <NA>
4:  2 2018-02-08       <NA>       <NA>          b
5:  3 2015-12-06          b          a          c
6:  3 2012-12-14          c          c          c
7:  4 2011-02-08       <NA>       <NA>       <NA>

我想创建一个变量y 来汇总所有列。变量中有一个 !is.na() 的所有内容都应该是 0 。所有变量中只有is.na 的每一行都应该是1。像这样:

   id       date variable_1 variable_2 variable_3 y
1:  1 2019-09-13          a       <NA>       <NA> 0
2:  2 2018-12-06          b       <NA>       <NA> 0
3:  2 2017-12-14       <NA>          a       <NA> 0
4:  2 2018-02-08       <NA>       <NA>          b 0
5:  3 2015-12-06          b          a          c 0
6:  3 2012-12-14          c          c          c 0
7:  4 2011-02-08       <NA>       <NA>       <NA> 1

在原始的 data.table 中,我在 830 个总变量中查看了 22 个变量。因此,我不希望分别使用 _1 到 _22 查找每个变量。 data.table有办法吗?

【问题讨论】:

    标签: r data.table na


    【解决方案1】:
    dt[, y := +(rowSums(!is.na(.SD)) == 0L), .SDcols = patterns("^variable_")]
    #    id       date variable_1 variable_2 variable_3 y
    # 1:  1 2019-09-13          a       <NA>       <NA> 0
    # 2:  2 2018-12-06          b       <NA>       <NA> 0
    # 3:  2 2017-12-14       <NA>          a       <NA> 0
    # 4:  2 2018-02-08       <NA>       <NA>          b 0
    # 5:  3 2015-12-06          b          a          c 0
    # 6:  3 2012-12-14          c          c          c 0
    # 7:  4 2011-02-08       <NA>       <NA>       <NA> 1
    

    演练:

    • .SDcols=patterns(...) 在j 组件中将要处理的列定义为.SD。这不涉及删除/选择输出列,只涉及将在内部引用的列。
    • !is.na(.SD) 返回一个logical matrix,与.SD 相同,表示其值为NA。
    • rowSums(...) 返回行中非NAs 的计数。
    • 使用“计算一行中非-NA值的数量”的反转逻辑,我们可以不关心正在处理的列数;这就是我可以使用== 0L的原因。
    • +(...) 是将logical 转换为0:1 的速记技巧

    【讨论】:

    • +1 和很好的解释!如果您喜欢两个相邻的一元运算符,这里有一些代码高尔夫乐趣:dt[, z := +!rowSums(!is.na(.SD)), .SDcols = patterns("^variable_")]。至少,它适用于这个数据集。
    猜你喜欢
    • 2018-08-03
    • 2023-04-03
    • 1970-01-01
    • 2013-05-07
    • 2013-04-20
    • 2019-11-18
    • 1970-01-01
    • 2021-05-14
    相关资源
    最近更新 更多