我在Stackoverflow上表示欢迎,因为几年来我第一次没有找到一个没有问过我心中相同问题的人(如果我错了,我的不好)。
我目前正在使用R来分析我建立的数据库。 它由来自不同研究的约75个人组成。这意味着,除其他外,数据框架不完整(并非每个人都有每个变量的值),这可能导致统计测试的困难。
为了想象这一点,我想知道是否有一种很酷,干净,快捷的方法来根据它所具有的数值(或者Na)对我的变量(而不是个体)进行排序?如果脚本可以聚合具有大致相同个体值的变量,那么它将成为我的一周。 (如果在LibreOffice表中有办法做到这一点,那对我也有好处)
谢谢大家
*我不使用MissMDA或等效的
来完成数据库答案 0 :(得分:1)
df <- data.frame(proband = c("John", "Mary", "Simon", "Paul"),
age = c(90, NA, 20, NA),
town = c("Las Vegas", "Paris", "Berlin", "Tokyo"),
knows_r = c(TRUE, NA, FALSE, FALSE))
现在,我们可以将dplyr
,arrange
和名为rowSums
的函数与is.na()
结合使用,如下所示:
library(dplyr)
df %>%
arrange(desc(rowSums(is.na(.))))
这会产生
proband age town knows_r
1 Mary NA Paris NA
2 Paul NA Tokyo FALSE
3 John 90 Las Vegas TRUE
4 Simon 20 Berlin FALSE
您可以看到,NA
s(Mary)最多的记录显示在顶部。您当然可以将其更改为:
df %>%
arrange(rowSums(is.na(.)))
哪会产生
proband age town knows_r
1 John 90 Las Vegas TRUE
2 Simon 20 Berlin FALSE
3 Paul NA Tokyo FALSE
4 Mary NA Paris NA
答案 1 :(得分:1)
df <- read.table(header = T, text ="
obs varx vary varz
1 1 1 1
2 NA NA 1
3 1 NA 1
")
df[names(sort(colSums(is.na(df))))]
# obs varz varx vary
# 1 1 1 1 1
# 2 2 1 NA NA
# 3 3 1 1 NA
is.na(df)
创建一个逻辑值矩阵,如果单元格为TRUE
则为NA
,否则为FALSE
colSums
对这些TRUE
或FALSE
值求和,以便获得每列中NA
个值的向量(列的名称为向量元素的名称)sort
将矢量从最低到最高排序(NA
s的低数量到NA
s的高数量names
创建排序向量的名称向量(列名称)df[
... ]
将数据框子集到指定顺序中指定的列,有效地重新排序列所以每一步看起来都像......
is.na(df)
# obs varx vary varz
# [1,] FALSE FALSE FALSE FALSE
# [2,] FALSE TRUE TRUE FALSE
# [3,] FALSE FALSE TRUE FALSE
colSums(is.na(df))
# obs varx vary varz
# 0 1 2 0
sort(colSums(is.na(df)))
# obs varz varx vary
# 0 0 1 2
names(sort(colSums(is.na(df))))
# [1] "obs" "varz" "varx" "vary"