[英]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
以便City
和Neigh
中的相应行元素一起出现, 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
被子集化以提取包含City
和Neighbour
列的c
串联向量,然后在应用于splt
之前进行最后一次t
转置和c
串联。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.