在R中,如何基于列表元素对数据帧的某些列进行降序排序,而其他列按升序排序?

约翰·史密斯

现在我有一个数据框和两个列表,每个列表包含一些数据框名称,我需要添加新列,其中包含该数据框内每个列的排名问题是我必须以Deslist1降序方式对列进行排名,而匹配的名称以Asclist1升序方式匹配,因此最终所需的输出类似于这个

我试过了any(within但它又tr<-any(Asclist1 %in% DF1无法正常工作了,我的问题不是如何添加包含排名的新列,我的问题是如何基于列表元素进行排名,因为您可以看到Asclist1包含的元素在DF1中不存在

DF1 <- data.frame("name" = c("john", "adam", "leo", "lena", "Di"),
                 "sex" = c("m", "m", "m", "f", "f"),
                 "age" = c(99, 46, 23, 54, 23),
                 "grade" = c(96, 46, 63, 54, 23),
                 "income" = c(59, 36, 93, 34, 23),
                 "score" = c(99, 46, 23, 54, 23))
                 print(DF1)

Asclist1<-list("score","income","spending")
Asclist1
Deslist2<-list("age","grade")
Deslist2

更新----代码1

library(readr)
library(tidyr)
library(purrr)
library(rlang)
library(glue)
library(dplyr)
library(miscTools)
library(matrixStats)
library(shiny)
library(reshape2)
library(dplyr)


hotdrinks<-list("tea","green tea") 
juices<-list("orange","mango") 
energydrinks<-list("powerhorse","redbull") 
drinks<-list("hotdrinks"=hotdrinks,"juices"=juices,"energydrinks"=energydrinks) 

biscuits<-list("loacker","tuc") 
choc<-list("aftereight","lindt") 
gum<-list("trident","clortes") 
sweets<-list("gum"=gum,"biscuits"=biscuits,"choc"=choc)

all_products<-list("sweets"=sweets,"drinks"=drinks)
mt<-melt(all_products)
mt2<-mt%>%mutate("Price"=c(23,34,23,23,54,32,45,23,12,56,76,43),
                 "Quantity"=c(10,20,26,22,51,52,45,23,12,56,76,43),
                 "amount"=c(23,34,23,23,54,32,45,23,12,56,76,43))

t1<-mt2[,c(4,3,1,5,6,7)]
t1
colnames(t1)<-c("CAT","PN","SP","Quantity","Price","amount")

t2<-list(unique(t1$CAT))
t2
QL<-c("Quantity","Price")
QD<-c("Quantity","amount")
QS<-c("amount","Price")


all <- list("drinks"=drinks, "sweets"=sweets)

FCX<-data.frame("sbo"=c("w","q","a"),
                "Quantity_fcx"=c(3,2,5),
                "Price_fcx"=c(7,8,5),
                "amount_fcx"=c(4,7,3)
)
#DF1<-Y
DF1 <- t1
DF1
#print(DF1)
DFCXL<-list(colnames(DF1[-c(1:3)]))
DFCXL
DFCX1<-lapply(DFCXL, paste0, "_fcx")
DFCX1
DFCXM<-colMeans(FCX[,unlist(DFCX1)],na.rm = FALSE)
DFCXM
DFCXMd<-colMedians(data.matrix(FCX[,unlist(DFCX1)]),na.rm = FALSE )
DFCXMddf<-as.data.frame(t(DFCXMd))
DFCXMddf
DFCX1l<-as.list(DFCX1)
colnames(DFCXMddf)<-unlist(DFCX1l)
DFCXMddf
#median repeated tibble
rDFCXMddf<-DFCXMddf[rep(seq_len(nrow(DFCXMddf)), each = nrow(DF1)), ]
rDFCXMddf
DFCX<-data.frame(t(DFCXM))
DFL<-as.vector(colnames(DF1))
DFL
DFCX
#mean repeated tibble
rDFCX<-DFCX[rep(seq_len(nrow(DFCX)), each = nrow(DF1)), ]
#rDFCX
#ascending rank form smallest to largest where the smallest is the most competitive
Asclist1<-list("Quantity","Price")
#Asclist1
#descending rank form largest to smallest where the largest is the most competitive
Deslist2<-list("xyz","amount")
#Deslist2
#DF3 contains orginal dataframe with rank for each column descending & ascending 
DF3<-
  DF1 %>% mutate_if(grepl(paste(Deslist2, collapse = "|"), names(.)), list(rank=~rank(-.))) %>% 
  mutate_if(grepl(paste(Asclist1, collapse = "|"), names(.)), list(rank=~rank( .)))

DF3
#DF4 contains only determinants columns
DF4<-DF3%>%select(-one_of(DFL))
DF4
#DF5 contains all deterements with their ranks columns
DF5<-cbind(rDFCX,DF4)
DF5
#getting final rank for each column based on multiplying CX columns "weight" * normal rank to get weighted ranking
dynamic_mutate = function(DF5,  
                          col_names = gsub("(.*)_\\w+$", "\\1", names(DF5)), 
                          expression = "({x}_rank*{x}_fcx)",
                          prefix = "FINAL"){
  name_list = col_names %>% unique() %>% as.list()
  expr_list = name_list %>% lapply(function(x) parse_quosure(glue(expression))) %>% 
    setNames(paste(prefix, name_list, sep = "_")) 
  DF5 %>% mutate(!!!expr_list)}
DF6<-DF5 %>% dynamic_mutate()
#DF6
#getting mean for ranks 
DFL2<-as.vector(colnames(DF5))
DF7<-DF6%>%select(-one_of(DFL2))
#DF7
#final limit ranking 
DF8<-mutate(DF7,fnl_scr=rowMeans(DF7))
#DF8
#final rank 
Ranking<-rank(DF8$fnl_scr)
#Ranking
#final dataframe
DF9<-as_tibble(cbind(DF1,Ranking))
DF9

代码2

library(readr)
library(tidyr)
library(purrr)
library(rlang)
library(glue)
library(dplyr)
library(miscTools)
library(matrixStats)
library(shiny)
library(reshape2)
library(dplyr)


hotdrinks<-list("tea","green tea") 
juices<-list("orange","mango") 
energydrinks<-list("powerhorse","redbull") 
drinks<-list("hotdrinks"=hotdrinks,"juices"=juices,"energydrinks"=energydrinks) 

biscuits<-list("loacker","tuc") 
choc<-list("aftereight","lindt") 
gum<-list("trident","clortes") 
sweets<-list("gum"=gum,"biscuits"=biscuits,"choc"=choc)

all_products<-list("sweets"=sweets,"drinks"=drinks)
mt<-melt(all_products)
mt2<-mt%>%mutate("Price"=c(23,34,23,23,54,32,45,23,12,56,76,43),
                 "Quantity"=c(10,20,26,22,51,52,45,23,12,56,76,43),
                 "amount"=c(23,34,23,23,54,32,45,23,12,56,76,43))

t1<-mt2[,c(4,3,1,5,6,7)]
t1
colnames(t1)<-c("CAT","PN","SP","Quantity","Price","amount")

t2<-list(unique(t1$CAT))
t2
QL<-c("Quantity","Price")
QD<-c("Quantity","amount")
QS<-c("amount","Price")


all <- list("drinks"=drinks, "sweets"=sweets)

FCX<-data.frame("sbo"=c("w","q","a"),
                "Quantity_fcx"=c(3,2,5),
                "Price_fcx"=c(7,8,5),
                "amount_fcx"=c(4,7,3)
)
#DF1<-Y
DF1 <- t1
DF1
#print(DF1)
DFCXL<-list(colnames(DF1[-c(1:3)]))
DFCXL
DFCX1<-lapply(DFCXL, paste0, "_fcx")
DFCX1
DFCXM<-colMeans(FCX[,unlist(DFCX1)],na.rm = FALSE)
DFCXM
DFCXMd<-colMedians(data.matrix(FCX[,unlist(DFCX1)]),na.rm = FALSE )
DFCXMddf<-as.data.frame(t(DFCXMd))
DFCXMddf
DFCX1l<-as.list(DFCX1)
colnames(DFCXMddf)<-unlist(DFCX1l)
DFCXMddf
#median repeated tibble
rDFCXMddf<-DFCXMddf[rep(seq_len(nrow(DFCXMddf)), each = nrow(DF1)), ]
rDFCXMddf
DFCX<-data.frame(t(DFCXM))
DFL<-as.vector(colnames(DF1))
DFL
DFCX
#mean repeated tibble
rDFCX<-DFCX[rep(seq_len(nrow(DFCX)), each = nrow(DF1)), ]
#rDFCX
#ascending rank form smallest to largest where the smallest is the most competitive
Asclist1<-list("Quantity","Price","amount")
#Asclist1
#descending rank form largest to smallest where the largest is the most competitive
Deslist2<-list("xyz")
#Deslist2
#DF3 contains orginal dataframe with rank for each column descending & ascending 
DF3<-
  DF1 %>% mutate_if(grepl(paste(Deslist2, collapse = "|"), names(.)), list(rank=~rank(-.))) %>% 
  mutate_if(grepl(paste(Asclist1, collapse = "|"), names(.)), list(rank=~rank( .)))

DF3
#DF4 contains only determinants columns
DF4<-DF3%>%select(-one_of(DFL))
DF4
#DF5 contains all deterements with their ranks columns
DF5<-cbind(rDFCX,DF4)
DF5
#getting final rank for each column based on multiplying CX columns "weight" * normal rank to get weighted ranking
dynamic_mutate = function(DF5,  
                          col_names = gsub("(.*)_\\w+$", "\\1", names(DF5)), 
                          expression = "({x}_rank*{x}_fcx)",
                          prefix = "FINAL"){
  name_list = col_names %>% unique() %>% as.list()
  expr_list = name_list %>% lapply(function(x) parse_quosure(glue(expression))) %>% 
    setNames(paste(prefix, name_list, sep = "_")) 
  DF5 %>% mutate(!!!expr_list)}
DF6<-DF5 %>% dynamic_mutate()
#DF6
#getting mean for ranks 
DFL2<-as.vector(colnames(DF5))
DF7<-DF6%>%select(-one_of(DFL2))
#DF7
#final limit ranking 
DF8<-mutate(DF7,fnl_scr=rowMeans(DF7))
#DF8
#final rank 
Ranking<-rank(DF8$fnl_scr)
#Ranking
#final dataframe
DF9<-as_tibble(cbind(DF1,Ranking))
DF9
阿克伦

另一种选择是map通过创建1,-1的列来同时执行此操作

library(dplyr)
library(tidyr)
library(purrr)
library(stringr)
tibble(col1 = list(Asclist1, Deslist2), col2 = c(1, -1)) %>% 
    unnest_longer(col1) %>% 
    group_split(col2) %>%
    map_dfc(~ DF1 %>% 
              mutate(tmp = first(.x$col2)) %>% 
              select(one_of(.x$col1), tmp)  %>% 
              transmute_at(vars(-tmp), list(rank = ~rank(tmp * .)))) %>% 
   bind_cols(DF1, .)
# name sex age grade income score age_rank grade_rank income_rank score_rank
#1 john   m  99    96     59    99      1.0          1           4        5.0
#2 adam   m  46    46     36    46      3.0          4           3        3.0
#3  leo   m  23    63     93    23      4.5          2           5        1.5
#4 lena   f  54    54     34    54      2.0          3           2        4.0
#5   Di   f  23    23     23    23      4.5          5           1        1.5
#Warning message:
#Unknown columns: `spending` 

它还将通知未知列作为警告

更新资料

如果只有一个带有的列transmute_at,则不会在list后缀中添加名称为了绕开它,我们可以创建一个函数rename_if

f1 <- function(dat) {
     nm1 <- setdiff(names(dat), "tmp")   
     n1 <- length(nm1)
    

      dat %>%
          transmute_at(vars(-tmp), list(rank = ~rank(tmp * .))) %>%
          rename_if(rep(n1 == 1, n1), ~ str_c(nm1, "_", .))       
                               
    }
            

tibble(col1 = list(Asclist1, Deslist2), col2 = c(1, -1)) %>% 
     unnest_longer(col1) %>% 
     group_split(col2) %>%
     map_dfc(~ DF1 %>% 
               mutate(tmp = first(.x$col2)) %>% 
               select(one_of(.x$col1), tmp)  %>% 
               f1(.)) %>% 
    bind_cols(DF1, .)
#  CAT           PN         SP Quantity Price amount amount_rank Quantity_rank Price_rank
#    1  sweets          gum    trident       23    10     23         9.5           3.5          1
#    2  sweets          gum    clortes       34    20     34         6.0           7.0          3
#    3  sweets     biscuits    loacker       23    26     23         9.5           3.5          6
#    4  sweets     biscuits        tuc       23    22     23         9.5           3.5          4
#    5  sweets         choc aftereight       54    51     54         3.0          10.0          9
#    6  sweets         choc      lindt       32    52     32         7.0           6.0         10
#    7  drinks    hotdrinks        tea       45    45     45         4.0           9.0          8
#    8  drinks    hotdrinks  green tea       23    23     23         9.5           3.5          5
#    9  drinks       juices     orange       12    12     12        12.0           1.0          2
#    10 drinks       juices      mango       56    56     56         2.0          11.0         11
#    11 drinks energydrinks powerhorse       76    76     76         1.0          12.0         12
#    12 drinks energydrinks    redbull       43    43     43         5.0           8.0          7

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

VB-如何按升序或降序对数据库中的结果进行排序

来自分类Dev

如何在Spring Data中按升序对一列进行排序,对降序进行排序?

来自分类Dev

如何按列值对数据帧进行排序?

来自分类Dev

按列对数据框中的某些行进行排序

来自分类Dev

按R中的特定顺序对数据帧中的列进行排序

来自分类Dev

如何在MapReduce中按降序对数据进行排序?

来自分类Dev

按一个因子列升序对数据框进行排序,另一个因子降序

来自分类常见问题

R在数据帧列表的每个数据帧中按字母顺序对列进行排序

来自分类Dev

R在数据帧列表的每个数据帧中按字母顺序对列进行排序

来自分类Dev

按R中的ALL列对数据框进行排序

来自分类Dev

按R中的ALL列对数据框进行排序

来自分类Dev

F#-如何按降序升序对列表进行排序?

来自分类Dev

按 R 中的最小列值对数据框列表进行排序

来自分类Dev

使用Perl按升序或降序对单个列进行排序

来自分类Dev

如何基于R中列向量的升序/降序对列表进行子集

来自分类Dev

在某些位置对一些列表元素进行排序,而其他位置保持不变

来自分类Dev

如何按R中的数据帧列表中的第二行从水平到最大的顺序对列进行排序?

来自分类Dev

SQL查询基于其他列值对数据进行排序

来自分类Dev

如何让我的快速排序算法按升序和降序对数组进行排序?

来自分类Dev

按列模式对数据帧进行排序/排序/聚类/排序

来自分类Dev

如何按升序对数值的浮动列表进行排序?

来自分类Dev

如何在Scala中按数字对中的第二对按降序对数字对列表进行排序?

来自分类常见问题

如何按目标向量给定的列值对数据帧进行重新排序

来自分类Dev

如何按目标向量给定的列值对数据帧进行重新排序

来自分类Dev

如何按一个变量对R中的数据帧进行排序,同时对其他变量进行分组

来自分类Dev

在多张纸中按降序对数据进行排序

来自分类Dev

以第一列的降序对数据进行排序,对于相等的值,以升序使用第二列

来自分类Dev

R中按列对元素进行排序

来自分类Dev

如何从PHP中的Key按升序对数组进行排序?

Related 相关文章

  1. 1

    VB-如何按升序或降序对数据库中的结果进行排序

  2. 2

    如何在Spring Data中按升序对一列进行排序,对降序进行排序?

  3. 3

    如何按列值对数据帧进行排序?

  4. 4

    按列对数据框中的某些行进行排序

  5. 5

    按R中的特定顺序对数据帧中的列进行排序

  6. 6

    如何在MapReduce中按降序对数据进行排序?

  7. 7

    按一个因子列升序对数据框进行排序,另一个因子降序

  8. 8

    R在数据帧列表的每个数据帧中按字母顺序对列进行排序

  9. 9

    R在数据帧列表的每个数据帧中按字母顺序对列进行排序

  10. 10

    按R中的ALL列对数据框进行排序

  11. 11

    按R中的ALL列对数据框进行排序

  12. 12

    F#-如何按降序升序对列表进行排序?

  13. 13

    按 R 中的最小列值对数据框列表进行排序

  14. 14

    使用Perl按升序或降序对单个列进行排序

  15. 15

    如何基于R中列向量的升序/降序对列表进行子集

  16. 16

    在某些位置对一些列表元素进行排序,而其他位置保持不变

  17. 17

    如何按R中的数据帧列表中的第二行从水平到最大的顺序对列进行排序?

  18. 18

    SQL查询基于其他列值对数据进行排序

  19. 19

    如何让我的快速排序算法按升序和降序对数组进行排序?

  20. 20

    按列模式对数据帧进行排序/排序/聚类/排序

  21. 21

    如何按升序对数值的浮动列表进行排序?

  22. 22

    如何在Scala中按数字对中的第二对按降序对数字对列表进行排序?

  23. 23

    如何按目标向量给定的列值对数据帧进行重新排序

  24. 24

    如何按目标向量给定的列值对数据帧进行重新排序

  25. 25

    如何按一个变量对R中的数据帧进行排序,同时对其他变量进行分组

  26. 26

    在多张纸中按降序对数据进行排序

  27. 27

    以第一列的降序对数据进行排序,对于相等的值,以升序使用第二列

  28. 28

    R中按列对元素进行排序

  29. 29

    如何从PHP中的Key按升序对数组进行排序?

热门标签

归档