【问题标题】:Ordering data frame in RR中的排序数据框
【发布时间】:2013-12-31 17:13:56
【问题描述】:

我有以下数据框结构:

    Animal          Food
1    cat      fish, milk, shrimp
2    dog      steak, poo
3    fish     seaweed, shrimp, krill, insects

我想重新组织它,使行按“食物”列中因子数量的降序排列:

    Animal          Food
1    fish     seaweed, shrimp, krill, insects
2    cat      fish, milk, shrimp
3    dog      steak, poo

是否有 R 函数可以帮助我解决这个问题? 谢谢

【问题讨论】:

    标签: r sorting dataframe plyr


    【解决方案1】:

    您可以使用count.fields 计算每个“食物”行中有多少物品并按此排序。

    count.fields(textConnection(mydf$Food), ",")
    # [1] 3 2 4
    

    假设您的data.frame 被称为“mydf”:

    mydf[order(count.fields(textConnection(mydf$Food), ","), decreasing=TRUE),]
    #   Animal                            Food
    # 3   fish seaweed, shrimp, krill, insects
    # 1    cat              fish, milk, shrimp
    # 2    dog                      steak, poo
    

    【讨论】:

      【解决方案2】:

      创建一个新变量并按其排序,编辑:感谢 Ananda 和 alexis

      df$nFood<-length(unlist(strsplit(df$Food, ",", fixed=T)))

      df$nFood<-sapply(strsplit(df$Food, ","), length)
      

      【讨论】:

      • 迟到 +1,因为这似乎很快。另外,比sapply(...) 快的应该是unlist(lapply(...))
      【解决方案3】:

      您可以根据计数功能的结果对框架进行排序:

      animals = data.frame( rbind(c("cat","fish, milk, shrimp"),
                        c("dog","steak, poo"),
                        c("fish","seaweed, shrimp, krill, insects")))
      colnames(animals) = c("Animal","Food")
      animals[order(sapply(animals$Food, function(x) { length(strsplit(as.character(x),split=",")[[1]]) })), ]
      

      我输入了as.character,因为它默认为一个因子,您可能不需要它(更快)或者您可以在创建数据框时使用stringsAsFactors=FALSE

      【讨论】:

        猜你喜欢
        • 2020-12-18
        • 1970-01-01
        • 2020-11-20
        • 1970-01-01
        • 1970-01-01
        • 2020-09-28
        • 1970-01-01
        • 2020-08-04
        • 2022-01-13
        相关资源
        最近更新 更多