我有一个大型数据帧(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获取最低值的方法,但它没有给我相应的邮政编码。
我将不胜感激任何帮助!
谢谢!
答案 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_by
和arrange
找到每个患者的距离,slice
取每个患者的前5行。 ungroup
不是必需的,但如果不再需要分组,则撤消group_by
很好。