【问题标题】:Return lowest 5 values and IDs for every variable in large df in R返回 R 中大 df 中每个变量的最低 5 个值和 ID
【发布时间】:2017-10-04 20:35:50
【问题描述】:

我有一个大数据框(4631 行 x 2995 列)。行代表美国所有医院的邮政编码,列代表患者的邮政编码。我计算了患者家拉链和医院之间的距离,因此每个单元格值都是一个数值,表示每个患者家和每家医院之间的英里数。

一个例子 df 是:

        10960     11040    56277    55379     

37160   674.14    238.04   25.89     5.31

37091   162.62    71.25    428.56    672.11

89148   931.31    0.03     389.25    1000.05

91776   15.05     508.74   315.61    101.01

我现在要做的是为每个患者提取最低的五个值,这将代表每个患者最近的五个医院。但我不仅需要提取单元格值,还需要行名,以便知道这些医院所在的邮政编码。

因此,例如,如果我只为每个患者/列寻找最低的两个值,我想知道对于患者 10960,最近的医院在 15.05 英里外,邮政编码为 91776,第二个最近的医院在 162.62 英里外,邮政编码为 37091。

我已经转置了这些数据,所以如果通过交换行和列来更容易做到这一点,这对我来说很好。我不需要代码来做到这一点。

我已经找到了使用函数和应用等获取最低值的方法,但它没有给我相应的邮政编码。

如果有任何帮助,我将不胜感激!

谢谢!

【问题讨论】:

  • 您能举一个数据集样本的例子吗?也许像dput(df[1:10, 1:5]) 这样的东西?邮政编码和患者代码分别只是行名和列名吗?
  • 抱歉,我不确定我是否理解您要求的示例类型。是的,医院邮政编码是行名,患者代码是列名,单元格值是医院和患者家庭邮政编码之间的英里数。病人的拉链在另一个数据集中,这个数据框只是我的距离分析的输出,我计算了医院拉链和病人拉链之间的距离。

标签: r sorting dplyr lapply sapply


【解决方案1】:

这样的事情应该可以解决问题:

library(dplyr)
library(tidyr)

df %>% 
  mutate(hospital = rownames(.)) %>% 
  gather("patient", "distance", -hospital) %>% 
  group_by(patient) %>% 
  arrange(distance) %>% 
  slice(1:5) %>% 
  ungroup

首先从行名中添加一个hospital 列,然后在gather 步骤中,距离的列被转换为行 - 每个列名都成为新的patient 列下的一个条目,并且每列中的距离成为distance 列的一部分。 group_byarrange find 对每个患者的距离进行排序,slice 获取每个患者的前 5 行。 ungroup 不是必需的,但如果不再需要分组,最好撤消 group_by

【讨论】:

    【解决方案2】:

    也许这会起作用:

    library(dplyr)
    
    test <- lapply(1:length(df), function(i) {
      x <- arrange(df, names(df)[i])
      tibble(HospitalZipCode = rownames(x)[1:5], 
             Distance = x[1:5,i, drop=TRUE], 
             Order = 1:5,
             PatientID=names(df)[i])
      }) %>% bind_rows()
    

    这应该会为您提供一个表格,其中每位患者有 5 行。我为医院的顺序添加了一列(1 表示最近,2 表示第二等)

    【讨论】:

      猜你喜欢
      • 2011-04-11
      • 1970-01-01
      • 2021-03-17
      • 1970-01-01
      • 2021-05-15
      • 1970-01-01
      • 1970-01-01
      • 2019-10-18
      • 1970-01-01
      相关资源
      最近更新 更多