R - 根据其中的值的数量对变量进行排序

时间:2018-04-24 08:35:20

标签: r sorting

我在Stackoverflow上表示欢迎,因为几年来我第一次没有找到一个没有问过我心中相同问题的人(如果我错了,我的不好)。

我目前正在使用R来分析我建立的数据库。 它由来自不同研究的约75个人组成。这意味着,除其他外,数据框架不完整(并非每个人都有每个变量的值),这可能导致统计测试的困难。

为了想象这一点,我想知道是否有一种很酷,干净,快捷的方法来根据它所具有的数值(或者Na)对我的变量(而不是个体)进行排序?如果脚本可以聚合具有大致相同个体值的变量,那么它将成为我的一周。 (如果在LibreOffice表中有办法做到这一点,那对我也有好处)

谢谢大家

*我不使用MissMDA或等效的

来完成数据库

2 个答案:

答案 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))

现在,我们可以将dplyrarrange和名为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对这些TRUEFALSE值求和,以便获得每列中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"