繁体   English   中英

按R中的多列排列列表 dataframe

[英]Order a list according to multiple columns in a dataframe in R

我最近问,然后回答了我自己的问题,发现它在这里是重复的:

对于列表中的每个命名元素,根据元素值之间的接近程度从同一列表返回另一个命名元素

在那里,我使用eurodist数据集根据平均距离找到最近的相邻城市Neigh of a city City 我使用split()lapply()来做到这一点。

library(data.table) # load package for transpose()

data(eurodist) # load eurodist data

labs <- labels(eurodist) # get city names
splt <- split(eurodist, labs) # split by city name

splt_mean <- lapply(splt, mean) # calculate mean for each city

x <- as.data.frame(splt_mean) # convert to data frame
x <- transpose(x) # transpose dataframe
colnames(x) <- "Mean" # name columns
rownames(x) <- labs # name rows

d <- data.frame(`diag<-`(as.matrix(dist(x$Mean)), Inf))
ids <- unlist(Map(which.min, d))
Neigh <- x$Mean[ids]
x <- data.frame(labs, x$Mean, Neigh) 
names(x)[1] <- "City"
names(x)[2] <- "Mean"
x[, 3] <- x$City[ids]

我已经成功地将解决方案应用于我自己的数据,现在还有一个我无法弄清楚的步骤。

我想order() splt以便CityNeigh中的相应行元素一起出现, City首先是Neigh 例如,调用新列表splt_sort ,我需要:

splt_sort
$Athens
[1] 3313 1326  966  330 1209 1418  328 2198 2250  618

$Rome
[1] 3927  204  747  789 1497  158  550 1178 2097 2707

...

有什么想法吗?

我会回答我自己的问题,但@akrun 值得赞扬。

他们的解决方案是一行 R 代码:

splt2 <- splt[c(t(x[, c("City", "Neighbour")]))]

其中x被子集化以提取包含CityNeighbour列的c串联向量,然后在应用于splt之前进行最后一次t转置和c串联。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM