【问题标题】:R data.table, select columns with no NAR data.table,选择没有NA的列
【发布时间】:2021-03-12 15:29:32
【问题描述】:

我这里有一张股票价格表:

https://drive.google.com/file/d/1S666wiCzf-8MfgugN3IZOqCiM7tNPFh9/view?usp=sharing

有些栏目有 NA,因为公司不存在(直到以后),或者公司倒闭了。

我想要做的是:选择没有 NA 的列。我使用 data.table 因为它更快。这是我的工作代码:

example <- fread(file = "example.csv", key = "date")
example_select <- example[, 
                          lapply(.SD, 
                                 function(x) not(sum(is.na(x) > 0)))
                          ] %>%
  as.logical(.)
example[, ..example_select]

是否有更好(更少行)的代码来做同样的事情?谢谢!

【问题讨论】:

  • 还有:d[ , which(sapply(d, anyNA)) := NULL]
  • 是否可以不输入两次“d”?此外,出现错误消息:“长度(LHS)==0;没有要删除或分配 RHS 的列。”

标签: r data.table


【解决方案1】:

试试:

example[,lapply(.SD, function(x) {if(anyNA(x)) {NULL} else {x}} )]

【讨论】:

  • 谢谢!两个问题:(1)为什么 {NULL} 和 {x} 需要 {}? (2) ifelse() 可行吗?
  • AFAIK, ifelse 在矢量上效果不佳:试一试。 NULLdata.table 的已删除列
  • 再次感谢您!我删除了我的愚蠢问题 (1) 为什么 {NULL} 和 {x} 需要 {}?
【解决方案2】:

有很多方法可以做到这一点。这是how I usually do it - 没有lapplydata.table 方法:

example[, .SD, .SDcols = colSums(is.na(example)) == 0]

【讨论】:

  • 谢谢!这更快!第二个“示例”可以通过引用完成,而无需再次输入吗?
  • 也许 :) 不过现在想不出办法。
【解决方案3】:

使用tidyverse 包的答案

library(readr)
library(dplyr)
library(purrr)

data <- read_csv("~/Downloads/example.csv")
map2_dfc(data, names(data), .f = function(x, y) { 
  column <- tibble("{y}" := x)
  if(any(is.na(column)))
    return(NULL)
  else
    return(column)
  })

输出

# A tibble: 5,076 x 11
   date         ACU   ACY    AE   AEF   AIM  AIRI   AMS   APT   ARMP  ASXC
   <date>     <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>  <dbl> <dbl>
 1 2001-01-02  2.75  4.75  14.4  8.44  2376   250  2.5   1.06 490000  179.
 2 2001-01-03  2.75  4.5   14.5  9     2409   250  2.5   1.12 472500  193.
 3 2001-01-04  2.75  4.5   14.1  8.88  2508   250  2.5   1.06 542500  301.
 4 2001-01-05  2.38  4.5   14.1  8.88  2475   250  2.25  1.12 586250  301.
 5 2001-01-08  2.56  4.75  14.3  8.75  2376   250  2.38  1.06 638750  276.
 6 2001-01-09  2.56  4.75  14.3  8.88  2409   250  2.38  1.06 568750  264.
 7 2001-01-10  2.56  5.5   14.5  8.69  2310   300  2.12  1.12 586250  274.
 8 2001-01-11  2.69  5.25  14.4  8.69  2310   300  2.25  1.19 564375  333.
 9 2001-01-12  2.75  4.81  14.6  8.75  2541   275  2     1.38 564375  370.
10 2001-01-16  2.75  4.88  14.9  8.94  2772   300  2.12  1.62 595000  358.
# … with 5,066 more rows

【讨论】:

  • 谢谢!由于这些数据可能会变得非常大,所以我将继续使用上面的 data.table 版本解决方案。
【解决方案4】:

使用Filter

library(data.table)
Filter(function(x) all(!is.na(x)), fread('example.csv'))

#            date   ACU   ACY   AE  AEF     AIM   AIRI  AMS   APT
#   1: 2001-01-02  2.75  4.75 14.4 8.44 2376.00 250.00 2.50  1.06
#   2: 2001-01-03  2.75  4.50 14.5 9.00 2409.00 250.00 2.50  1.12
#   3: 2001-01-04  2.75  4.50 14.1 8.88 2508.00 250.00 2.50  1.06
#   4: 2001-01-05  2.38  4.50 14.1 8.88 2475.00 250.00 2.25  1.12
#   5: 2001-01-08  2.56  4.75 14.3 8.75 2376.00 250.00 2.38  1.06
#  ---                                                           
#5072: 2021-03-02 36.95 10.59 28.1 8.77    2.34   1.61 2.48 14.33
#5073: 2021-03-03 38.40 10.00 30.1 8.78    2.26   1.57 2.47 12.92
#5074: 2021-03-04 37.90  8.03 30.8 8.63    2.09   1.44 2.27 12.44
#5075: 2021-03-05 35.68  8.13 31.5 8.70    2.05   1.48 2.35 12.45
#5076: 2021-03-08 37.87  8.22 31.9 8.59    2.01   1.52 2.47 12.15

#          ARMP   ASXC
#   1: 4.90e+05 178.75
#   2: 4.72e+05 192.97
#   3: 5.42e+05 300.62
#   4: 5.86e+05 300.62
#   5: 6.39e+05 276.25
#  ---                
#5072: 5.67e+00   3.92
#5073: 5.58e+00   4.54
#5074: 5.15e+00   4.08
#5075: 4.49e+00   3.81
#5076: 4.73e+00   4.15

【讨论】:

    猜你喜欢
    • 2012-09-20
    • 2017-03-10
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    • 2019-10-15
    相关资源
    最近更新 更多