簡體   English   中英

R從data.table中刪除總和為0的列-仍然無法正常工作

[英]R remove columns from data.table that sum to 0 - still not working

這似乎是一個重復的問題,但也許我在這里遺漏了一些東西。

我一直在嘗試只從data.table中刪除絕對值之和加到零的列。

我在該網站上搜索並找到了許多聲稱可以正常工作的解決方案,實際上,當我復制/粘貼確切的代碼時,它確實可以工作。 但是,由於某種原因,我無法將其與data.table復制。

我執行幾乎所有操作的結果都會將我的data.table變成一個列表。 我什至嘗試將我的data.table轉換為data.frame來嘗試這些解決方案,但沒有運氣。

這里

SelectVar[, colSums(SelectVar != 0) > 0]

不起作用。

SelectVar[, !apply(SelectVar == 0, 2, all)]

也不起作用。

remove_zero_cols <- function(df) {
  rem_vec <- NULL
  for(i in 1:ncol(df)){
    this_sum <- summary(df[,i])
    zero_test <- length(which(this_sum == 0))
    if(zero_test == 6) {
      rem_vec[i] <- names(df)[i]
    }
  }
  features_to_remove <- rem_vec[!is.na(rem_vec)]
  rem_ind <- which(names(df) %in% features_to_remove)
  df <- df[,-rem_ind]
  return(df)
}

此功能也不起作用。

我檢查了每個參數的類,它們都是數字或整數類型。 我還檢查了所有NA,但均未找到。

有什么建議么?

如果您正在處理data.table,則將with = FALSE添加到您引用的第一個解決方案。

# Create example data frame
SelectVar <- read.table(text = "    a   b  c   d   e   f   g   h   i j k l ll m n o p  q   r
1 Dxa8 Dxa8 0 Dxa8 Dxa8 0 Dxa8 Dxa8 0 0 0 0  0 0 0 0 0 Dxc8 0
2 Dxb8 Dxc8 0 Dxe8 Dxi8 0 tneg tpos 0 0 0 0  0 0 0 0 0 Dxi8 0",
                        header = TRUE, stringsAsFactors = FALSE)

# Convert to a data.table
library(data.table)

setDT(SelectVar)

SelectVar[, colSums(SelectVar != 0) > 0, with = FALSE]
#       a    b    d    e    g    h    q
# 1: Dxa8 Dxa8 Dxa8 Dxa8 Dxa8 Dxa8 Dxc8
# 2: Dxb8 Dxc8 Dxe8 Dxi8 tneg tpos Dxi8

這是一個整潔的解決方案。 您可以將data.table轉換為小標題,然后從那里開始。

library(tidyverse)
df <- tibble(a = 1:5, b = -1:3, c = 0)

selection_criteria <- (colSums(abs(df)) != 0)
df[selection_criteria]

OP要求僅刪除絕對值之和為零的列 后來,他澄清了自己想刪除的data.table列,其中每行僅包含0

這可以通過使用any()函數來實現

library(data.table)

#create sample data
n_rows <- 10L
n_cols <-  5L
DT <- data.table(id = 1:n)
dat_cols <- sprintf("dat%i", seq.int(n_cols))
for (j in seq.int(n_cols)) set(DT, NULL, dat_cols[j], 0L)
set.seed(1L)
DT[sample.int(n_rows, 0.1 * n_rows), (sample.int(n_cols, 0.5 * n_cols)) := 1L]
DT
  id dat1 dat2 dat3 dat4 dat5 1: 1 0 0 0 0 0 2: 2 0 1 1 0 0 3: 3 0 0 0 0 0 4: 4 0 0 0 0 0 5: 5 0 0 0 0 0 6: 6 0 0 0 0 0 7: 7 0 0 0 0 0 8: 8 0 0 0 0 0 9: 9 0 0 0 0 0 10: 10 0 0 0 0 0 
# find columns which are all zero using any()
dat_cols <- sprintf("dat%i", seq.int(n_cols))
zero_cols <- setDT(DT)[, lapply(.SD, function(x) !any(x)), 
                .SDcols = dat_cols]
# remove columns in place
DT[, (names(which(unlist(zero_cols)))) := NULL][]
  id dat2 dat3 1: 1 0 0 2: 2 1 1 3: 3 0 0 4: 4 0 0 5: 5 0 0 6: 6 0 0 7: 7 0 0 8: 8 0 0 9: 9 0 0 10: 10 0 0 

之前:

library(tidy verse)
DT = as_tibble(list(x=c(1,0), y=c(0,0)))
DT

A tibble: 2 x 2
        x     y
      <dbl> <dbl>
  1     1     0
  2     0     0

采用:

DT1 = DT %>% select_if(any)
DT1

后:

  tibble: 2 x 1
        x
      <dbl>
  1     1
  2     0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM