R 随笔

纸屏石枕竹方床,手倦抛书午梦长。

Posted by Chevy on August 29, 2022

1. 三种方法去除data.frame里面的空列

对于去除data.frame里面的空行,对R来说比较简单,na.omit即可。但是去NA或者空列的话,就需要花点脑筋。

0. 构建一个data.frame数据

my_df <- data.frame(X1 = c(1:10),
                    X2 = rep(NA, 10),
                    X3 = letters[seq( from = 1, to = 10 )],
                    X4 = rep("",10))
my_df

数据如下:

   X1 X2 X3 X4
1   1 NA  a   
2   2 NA  b   
3   3 NA  c   
4   4 NA  d   
5   5 NA  e   
6   6 NA  f   
7   7 NA  g   
8   8 NA  h   
9   9 NA  i   
10 10 NA  j   

1. 使用R语言自带的ColSums()函数

  • 确定含空列或者含NA列,随后使用nrow()函数判断是否为全空列或者全NA列;
colSums(is.na(my_df) | my_df == "")
empty_columns <- colSums(is.na(my_df) | my_df == "") == nrow(my_df)
  • 随后使用[]去掉df里面的对应列;
my_df[, !empty_columns]
  • 最后输出结果:
   X1 X3
1   1  a
2   2  b
3   3  c
4   4  d
5   5  e
6   6  f
7   7  g
8   8  h
9   9  i
10 10  j

2. 使用sapply()函数来做空列或者NA列去除

  • sapply()函数使用一个data.frame作为输入,然后对行或者列应用一个函数;
  • 我们可以使用all()函数,all()函数会返回逻辑判断组合的判断值(如果全是True会返回True,如果既有True也有False,就会返回False)
empty_columns <- sapply(my_df, function(x) all(is.na(x) | x == ""))
my_df[, !empty_columns]

3. 使用discard ()函数来处理

  • discard()函数是tidyverse包的一个函数,它会去处满足某个条件的列,这个时候这个判断条件我们可以使用第二个方法的all()函数:
if (!require("tidyverse")) install.packages("tidyverse")
my_df %>% discard(~all(is.na(.) | . ==""))

2. 一个小函数提取lm模型的p值(或其他参数)

lmp <- function (modelobject) {
  if (class(modelobject) != "lm") stop("Not an object of class 'lm' ")
  f <- summary(modelobject)$fstatistic
  if (is.null(f)) {
    p <- 1
  } else {  
    p <- pf(f[1],f[2],f[3],lower.tail=F)
    attributes(p) <- NULL
    }
  return(p)
}

3. 将长度不同的list转化为matrix或者data.frame

方案1,利用plyr的函数:

plyr::ldply(your.list, rbind)

方案2,利用stringi的函数:

library(stringi)
stri_list2matrix(l, byrow=TRUE)

方案3:使用sapply函数

word.list <- list(letters[1:4], letters[1:5], letters[1:2], letters[1:6])
n.obs <- sapply(word.list, length)
seq.max <- seq_len(max(n.obs))
mat <- t(sapply(word.list, "[", i = seq.max))

4. 去除data.frame里面的NA

your_dataframe %>% replace(is.na(.), "")

your_dataframe %>% mutate_all(~ replace_na(., ""))