【问题标题】:How to access columns that contains the argument in data frame and sort in decreasing order如何访问包含数据框中参数的列并按降序排序
【发布时间】:2018-02-03 04:57:47
【问题描述】:

我正在处理一个包含列名、公司名称、部门名称 all_production_2017、bad_production_2017 的数据框......多年前

现在我正在编写一个函数,它以公司 nameyear 作为参数,并总结公司在该年的生产。然后按 all_production_year

的降序排序

我已经将年份转换为字符串并过滤了所需的行和列。但是如何按特定列对其进行排序?我不知道如何访问该列名,因为参数 year 是它的后缀。

这是我的数据框结构的粗略草图。

结构(列表(公司 = c(“DLT”,“DLT”,“DLT”,“MSF”,“MSF”,“MSF”), 部门= c(“营销”,“CHANG1”,“CAHNG2”,“营销”,“CHANG1M”,“CHANG2M”), all_production_2000 = c(15, 25, 25, 10, 25, 18), good_production_2000 = c(10, 24, 10, 8, 10, 10), bad_production_2000 = c(2, 1, 2, 1, 3, 5)))

包含 2000 年至 2017 年的数据 我想写一个给出公司名称和年份的函数。 它可以过滤掉相关的公司和年份,并按降序对 all_production_thatyear 进行排序。

到目前为止我已经完成了。

ExportCompanyYear <- function(company.name, year){
   year.string <- toString(year)
   x <- filter(company.data, company == company.name) %>%
      select(company, division, contains(year.string))
}

我只是不知道如何按降序排序,因为我不知道如何访问包含参数 year 的列名。

【问题讨论】:

  • 请分享一下你的data.frame的结构以及你目前写的功能代码。要分享您的 data.frame 结构,请将dput(head(df,10)) 的输出粘贴到问题描述中。

标签: r


【解决方案1】:

您肯定需要以year 值可以作为参数传递的方式重塑您的数据。

为了创建可重现的示例,我在数据中添加了另一年 2001

df = data.frame(company = c("DLT", "DLT", "DLT", "MSF", "MSF", "MSF"), division = c("Marketing", "CHANG1", "CAHNG2", "MARKETING", "CHANG1M", "CHANG2M"), all_production_2000 = c(15, 25, 25, 10, 25, 18), good_production_2000 = c(10, 24, 10, 8, 10, 10), bad_production_2000 = c(2, 1, 2, 1, 3, 5),all_production_2001 = 2*c(15, 25, 25, 10, 25, 18), good_production_2001 = 2*c(10, 24, 10, 8, 10, 10), bad_production_2001 = 2*c(2, 1, 2, 1, 3, 5))

现在您可以使用 R 中的 reshape 函数来重塑数据。 在这里,变量 "all_production","good_production","bad_production" 随时间变化,而这些变量的年份值也在变化。

所以我们指定v.names = c("all_production","good_production","bad_production")

df2 = reshape(df,direction="long",
v.names = c("all_production","good_production","bad_production"),
varying = names(df)[3:8],
idvar = c("company","division"),
timevar = "year",times = c(2000,2001))

对于您的 data.frame,您可以指定 times=2000:2017varying=3:ncol(df)

>df2
                   company  division year all_production good_production bad_production
DLT.Marketing.2000     DLT Marketing 2000             15               2             10
DLT.CHANG1.2000        DLT    CHANG1 2000             25               1             24
DLT.CAHNG2.2000        DLT    CAHNG2 2000             25               2             10
MSF.MARKETING.2000     MSF MARKETING 2000             10               1              8
MSF.CHANG1M.2000       MSF   CHANG1M 2000             25               3             10
MSF.CHANG2M.2000       MSF   CHANG2M 2000             18               5             10
DLT.Marketing.2001     DLT Marketing 2001             30               4             20
DLT.CHANG1.2001        DLT    CHANG1 2001             50               2             48
DLT.CAHNG2.2001        DLT    CAHNG2 2001             50               4             20
MSF.MARKETING.2001     MSF MARKETING 2001             20               2             16
MSF.CHANG1M.2001       MSF   CHANG1M 2001             50               6             20
MSF.CHANG2M.2001       MSF   CHANG2M 2001             36              10             20

现在您可以像这样过滤和排序:

library(dplyr)
somefunc<-function(company.name,yearval){
    df2%>%filter(company==company.name,year==yearval)%>%arrange(-all_production)
}

>somefunc("DLT",2001)
  company  division year all_production good_production bad_production
1     DLT    CHANG1 2001             50               2             48
2     DLT    CAHNG2 2001             50               4             20
3     DLT Marketing 2001             30               4             20

【讨论】:

    【解决方案2】:

    虽然看起来 OP 提供了一个非常简单的sample data,其中只包含2000 一年的数据。

    解决方法可能是: 1.将列表转换为data.frame 2. 使用tidyr 中的gather 将数据框排列成可以应用过滤器的方式

        ll <- structure(list(company = c("DLT", "DLT", "DLT", "MSF", "MSF", "MSF"),
           division = c("Marketing", "CHANG1", "CAHNG2", "MARKETING", "CHANG1M",
     "CHANG2M"), all_production_2000 = c(15, 25, 25, 10, 25, 18),
           good_production_2000 = c(10, 24, 10, 8, 10, 10), 
           bad_production_2000 = c(2, 1, 2, 1, 3, 5)))
    
    df <- as.data.frame(ll)
    library(tidyr)
    gather(df, key = "key", value = "value", -c("company",  "division"))
    
    #result:
    # company  division                  key value
    #1      DLT Marketing  all_production_2000    15
    #2      DLT    CHANG1  all_production_2000    25
    #3      DLT    CAHNG2  all_production_2000    25
    #4      MSF MARKETING  all_production_2000    10
    #5      MSF   CHANG1M  all_production_2000    25
    #6      MSF   CHANG2M  all_production_2000    18
    #7      DLT Marketing good_production_2000    10
    #8      DLT    CHANG1 good_production_2000    24
    #9      DLT    CAHNG2 good_production_2000    10
    #10     MSF MARKETING good_production_2000     8
    #11     MSF   CHANG1M good_production_2000    10
    #12     MSF   CHANG2M good_production_2000    10
    #13     DLT Marketing  bad_production_2000     2
    #14     DLT    CHANG1  bad_production_2000     1
    #15     DLT    CAHNG2  bad_production_2000     2
    

    现在,可以在上面的 data.frame 上轻松应用过滤器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-23
      • 2020-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-09
      相关资源
      最近更新 更多