【问题标题】:apply a function to data frame according to the i'th element of a list in R根据R中列表的第i个元素将函数应用于数据框
【发布时间】:2018-01-06 16:22:04
【问题描述】:

我想通过只使用 apply 和避免循环来实现以下结果:

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 有很多行,我想避免循环。

谢谢!

【问题讨论】:

  • 请提供dA(或其重要子集)并根据dA更好地描述所需的输出。
  • dA[1,]=c(900, 800, 1000, 100, 1100, 600, 200, 1200, 1300, 400), dA[2,] = c(400, 200, 100) , 900, 700, 300, 600, 1000, 1100, 500),所以最终结果应该是 dA 的元素 1,3,4,8 排序后,给出 dA_new[[1]] = c(100, 900, 1000, 1200) 以此类推 dA 的每一行。 dA_new 是一个列表,因为每行要排序的元素数量不同

标签: r loops sorting apply


【解决方案1】:

我认为这会满足您的需求...

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

【讨论】:

    【解决方案2】:

    好的,现在我得到了问题。 您必须使用 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)
    

    【讨论】:

    • 这使用了指定 df 的转置版本 - a 和 b 应该是行,而不是列。
    猜你喜欢
    • 2022-07-13
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-31
    • 2016-07-08
    相关资源
    最近更新 更多