【问题标题】:How to refer from a column to names of other columns and create a new column如何从一列引用其他列的名称并创建一个新列
【发布时间】:2021-01-16 04:56:21
【问题描述】:

我有一张桌子,比如

+---------+---------+--------+--------+--------+
| Product | Classif | Type 1 | Type 2 | Type 3 |
+---------+---------+--------+--------+--------+
| a       | Type 1  |      2 |      6 |      8 |
| b       | Type 2  |      3 |      9 |     11 |
| c       | Type 3  |      5 |     10 |     15 |
+---------+---------+--------+--------+--------+

我有一个产品列表和它们的分类。产品和分类之间的匹配足以确定它们的价格(在第 3 到第 5 列中)。 我想要一个新列,根据其类型显示每种产品的价格,例如:

+---------+---------+--------+--------+--------+-------+
| Product | Classif | Type 1 | Type 2 | Type 3 | Price |
+---------+---------+--------+--------+--------+-------+
| a       | Type 1  |      2 |      6 |      8 |     2 |
| b       | Type 2  |      3 |      9 |     11 |     9 |
| c       | Type 3  |      5 |     10 |     15 |    15 |
+---------+---------+--------+--------+--------+-------+

程序比较列classif的值,并从对应列中取值。

【问题讨论】:

    标签: r merge matching calculated-columns refer


    【解决方案1】:

    这行得通吗?

    library(data.table)
    
    df <- data.table(Product = c('a', 'b', 'c'), 
                 Classif = c('Type 1', 'Type 2', 'Type 3'),
                 `Type 1` = c(2, 3, 5),
                 `Type 2` = c(6,9,10),
                 `Type 3` = c(8,11,15)
                 )
    
    
    df2 <- df[,`:=`(
      Price = case_when(
         Classif == 'Type 1' ~ `Type 1`,
         Classif == 'Type 2' ~ `Type 2`,
         Classif == 'Type 3' ~ `Type 3`
      )
    )]
    

    【讨论】:

    • case_when 需要 dplyr,但仅供参考,当前版本的 data.table 1.13 现在有一个案例功能,fcase(如果您只想使用一个包)
    【解决方案2】:

    您可以先将数据重新整形为 long,然后计算比较以获得价格,以便与left_join() 连接在一起。这里使用tidyverse函数的代码:

    library(tidyverse)
    #Code
    df2 <- df %>% left_join(df %>% pivot_longer(-c(Product,Classif)) %>%
      mutate(Price=ifelse(Classif==name,value,NA)) %>%
      filter(!is.na(Price)) %>% select(-c(name,value)))
    

    输出:

      Product Classif Type 1 Type 2 Type 3 Price
    1       a  Type 1      2      6      8     2
    2       b  Type 2      3      9     11     9
    3       c  Type 3      5     10     15    15
    

    使用的一些数据:

    #Data
    df <- structure(list(Product = c("a", "b", "c"), Classif = c("Type 1", 
    "Type 2", "Type 3"), `Type 1` = c(2, 3, 5), `Type 2` = c(6, 9, 
    10), `Type 3` = c(8, 11, 15)), row.names = c(NA, -3L), class = "data.frame")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-04
      • 2020-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多