返回R

时间:2017-10-04 20:35:51

标签: r sorting dplyr lapply sapply

我有一个大型数据帧(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。

我将这些数据转换为如果通过交换我认可的行和列更容易实现这一点。我不需要代码来做到这一点。

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

我将不胜感激任何帮助!

谢谢!

2 个答案:

答案 0 :(得分:0)

也许这会奏效:

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个等)

答案 1 :(得分:0)

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

library(dplyr)
library(tidyr)

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

首先从rownames添加hospital列,然后在gather步骤中将距离列转换为行 - 每个colname成为新patient列下的条目并且每列中的距离成为distance列的一部分。 group_byarrange找到每个患者的距离,slice取每个患者的前5行。 ungroup不是必需的,但如果不再需要分组,则撤消group_by很好。