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(., ""))