使用r中的for循环对列表中的每个数据帧按升序排列两列



标题说明了一切。长话短说,我累了,似乎在兜圈子试图弄清楚如何让这个工作。我有一个包含6个数据帧的列表,我已经粘贴了前2个数据帧的示例。

<<p>列表数据/strong>
list(`1` = structure(list(Study = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), Group = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L), .Label = c("1", "2", "3", "4", "5", "6", "7", "8", "9", 
"10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20"
), class = "factor"), Scale_1 = c(26.97560976, 24.30081301, 15.82113821, 
15.70731707, 13.2601626, 12.86178862, 11.7804878, 10.69918699, 
10.58536585, 8.593495935, 8.024390244, 5.406504065, 5.406504065, 
5.577235772, 2.674796748, 1.422764228, 1.308943089, 0.227642276
), Scale_2 = c(26.96774194, 24.35483871, 15.74193548, 15.70967742, 
13.22580645, 12.87096774, 11.77419355, 10.67741935, 10.58064516, 
8.548387097, 8, 5.548387097, 5.35483871, 5.322580645, 2.612903226, 
1.483870968, 1.225806452, 0.258064516)), row.names = c(NA, 18L
), class = "data.frame"), `2` = structure(list(Study = c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), 
Group = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L), .Label = c("1", "2", "3", "4", "5", 
"6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", 
"17", "18", "19", "20"), class = "factor"), Scale_1 = c(20.20325203, 
16.56097561, 15.76422764, 14.62601626, 7.056910569, 6.601626016, 
5.691056911, 4.666666667, 4.666666667, 3.642276423, 3.414634146, 
2.788617886, 2.447154472, 1.650406504, 1.422764228, 0.569105691
), Scale_2 = c(20.19354839, 16.5483871, 15.74193548, 14.61290323, 
7.064516129, 6.580645161, 5.64516129, 4.580645161, 4.612903226, 
3.612903226, 3.35483871, 2.741935484, 2.419354839, 1.64516129, 
1.35483871, 0.516129032)), row.names = 19:34, class = "data.frame"))

我想做什么

我要做的是创建一个相同长度的新列表,但这次的值为"Scale_1"one_answers";Scale_2"在每个数据帧中按升序排序。到目前为止,我得到的代码如下:

#Step 1: Create new (empty) list to store results for for loop

result_list<- list()
#Create for loop 
for (i in 1:length(Split_Data)){
result_list[i]<- Split_Data[i][order(Split_Data["Scale_1"])]
}

What I have try

我已经尝试了很多不同的变体几乎相同的事情,几乎没有成功。每次尝试都会导致一些隐式错误或错误的输出。以下是我尝试过的一些例子。

  1. result_list[i]<- Split_Data[i][order(Split_Data[c("Scale_1", "Scale_2"])]
  2. result_list[i]<- Split_Data[i][order(Split_Data[[, c(13,14)]])]

我还尝试了其他迭代,使用双括号和单括号,但成功有限,因为我对for循环内的索引很陌生…尤其是在处理列表的时候。总的来说,我对R还是比较陌生的,因为我实际上没有太多的时间来学习,所以任何资源也会很感激。

我知道for循环在R社区中通常是不受欢迎的,我得到lapply可能可以用于此,但我已经尝试过了,并且也取得了有限的成功。这一切都归结为我(a)很累,(b)对列表缺乏经验。

我相信这对这里的大多数人来说是一个容易的间谍,但老实说,我的经验不足和沉重的眼睛现在对我没有任何帮助。提前感谢所有提出解决方案的人。永远感谢r的英雄们。

我们可以在base R中使用lapply

Split_Data <- lapply(Split_Data, function(x) x[order(-x$Scale_1, -x$Scale_2),])

或与mappurrrarrange(默认升序)

library(purrr)
library(dplyr)
Split_Data <- map(Split_Data, ~ .x %>%
arrange(desc(Scale_1), desc(Scale_2)))

最新更新