根据R中列表的第i个元素将函数应用于数据帧

时间:2017-07-31 07:43:56

标签: r loops sorting apply

我想通过仅使用apply和avoid循环来实现以下结果:

dA是一个数据框,我想订购(排序)每行dA的特定元素。我要排序的元素列在列表中。

例如:

Elements[[1]] = c(1,3,4,8)

Elements[[2]] = c(2,3,4,5,6,7,9)

所以结果应该是一个列表dA_new,其中第一行元素{1,3,4,8}被排序,第二行元素{2,3,4,5,6,7,9}排序。 由于Elements有很多行,我想避免循环。

谢谢!

2 个答案:

答案 0 :(得分:0)

好的,我现在有了问题。 您必须使用Map(只是lapply的多维版本)应用于数据框的每一列,列表的每个元素以过滤正确的行。 然后你必须在结果列表上使用apply来排序

a=c(900, 800, 1000, 100, 1100, 600, 200, 1200, 1300, 400)
b = c(400, 200, 100, 900, 700, 300, 600, 1000, 1100, 500)
dA<-data.frame(rbind(a,b))
dA


Elements<-list()
Elements[[1]] = c(1,3,4,8)
Elements[[2]] = c(2,3,4,5,6,7,9)

lapply(Map("[",as.data.frame(t(dA)),Elements),sort)

答案 1 :(得分:0)

我认为这会做你想要的......

mapply(function(x,y) sort(x[y]), as.data.frame(t(dA)), Elements)

$`1`
[1]  100  900 1000 1200

$`2`
[1]  100  200  300  600  700  900 1100