如何在R中删除空列?

k7fdbhmy  于 2023-05-20  发布在  其他
关注(0)|答案(8)|浏览(150)

我有一个CSV文件

Identity,Number,Data,Result,Add,,,,,,,,,,,,
1,,,,4,55,,92,,,,,,,,,62,
3,,,,7,43,,12,,,,,,,,,74,
7,,,,3,58,,52,,,,,,,,,64,
0,,,,6,10,,22,,,,,,,,,96,
3,,,,8,13,,92,,,,,,,,,22,

如何在R中删除空列?
期望输出

Identity,Number,Data,Result,Add
1,4,55,92,62
3,7,43,12,74
7,3,58,52,64
0,6,10,22,96
3,8,13,92,22
5m1hhzi4

5m1hhzi41#

导入数据后(使用其他回答者建议的方法),运行以下命令,将mydf替换为您决定调用的 Dataframe :

#Remove empty columns
mydf <- Filter(function(x)!all(is.na(x)), mydf)
kcrjzv8t

kcrjzv8t2#

将空单元格转换为NA,然后删除NA

mydata[mydata == ""] <- NA
mydata<- mydata[,colSums(is.na(mydata)) < <a desired filter value>]
vktxenjb

vktxenjb3#

更复杂的移除逻辑是这样的:

mydf <- Filter(function(x)!all(is.na(x) || is.null(x) || x == "" || x == 0), mydf)
vi4fp9gy

vi4fp9gy4#

janitor尝试remove_empty
使用来自托马斯的帖子的输入:

> mydf

  V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18
1  1 NA NA NA  4 55 NA 92 NA  NA  NA  NA  NA  NA  NA  NA  62  NA
2  3 NA NA NA  7 43 NA 12 NA  NA  NA  NA  NA  NA  NA  NA  74  NA
3  7 NA NA NA  3 58 NA 52 NA  NA  NA  NA  NA  NA  NA  NA  64  NA
4  0 NA NA NA  6 10 NA 22 NA  NA  NA  NA  NA  NA  NA  NA  96  NA
5  3 NA NA NA  8 13 NA 92 NA  NA  NA  NA  NA  NA  NA  NA  22  NA

> mydf %>% remove_empty("cols")

1  1  4 55 92  62
2  3  7 43 12  74
3  7  3 58 52  64
4  0  6 10 22  96
5  3  8 13 92  22
waxmsbnn

waxmsbnn5#

如果我们的列数有限,就像您在本例中的列数一样,下面是一个很好的解决方法。

myDF<-myDF[,c(1,2,3,4,5)]
dojqjjoe

dojqjjoe6#

加载数据文件,不包括标题行:

mydf <- 
read.csv(text='Identity,Number,Data,Result,Add
1,,,,4,55,,92,,,,,,,,,62,
3,,,,7,43,,12,,,,,,,,,74,
7,,,,3,58,,52,,,,,,,,,64,
0,,,,6,10,,22,,,,,,,,,96,
3,,,,8,13,,92,,,,,,,,,22,', header=FALSE, skip=1)

然后只加载标题行:

n <- read.csv(text='Identity,Number,Data,Result,Add', header=TRUE)

然后使用来自n的名称为完整数据分配名称,不包括NA列:

setNames(mydf[,sapply(mydf, function(x) all(!is.na(x)))],names(n))

请注意,如果您将其保存为文件,则完整代码应为:

mydf <- read.csv('file.csv', header=FALSE, skip=1)
n <- read.csv('file.csv', header=TRUE, nrows=1)
setNames(mydf[,sapply(mydf, function(x) all(!is.na(x)))],names(n))
aurhwmvo

aurhwmvo7#

你只保留那些名字不为空的列怎么样?

> mydf <- mydf[,names(mydf)!=""]
y3bcpkx1

y3bcpkx18#

这是一个我有时候为了好玩而使用的奇特函数。请注意,它并不健壮-它会在整个环境中搜索.data数据集,如果运行select(),则dplyr会将其放在那里,因此它取决于其内部框架(可能会更改):

empty_cols <- function(x) {
  for (frm in sys.frames()) {
    if (is.data.frame(frm$.data)) {
      df <- frm$.data
      return(which(sapply(df, function(col) all(is.na(col)))))
    }
  }
  # found nothing, return NULL to return no columns:
  NULL
}

现在选择使用:

library(dplyr)
my_df %>% select(!empty_cols())

如果我们可以在这个函数中使用dplyr::pick(everything())就好了,但是他们限制了mutate()filter()group_by()的使用。

相关问题