【问题标题】:Look-up table with different values for each column每列具有不同值的查找表
【发布时间】:2020-11-10 22:36:38
【问题描述】:

我有一个表,其中包含我的所有列、它们可能的对应值以及每个值的描述。例如,表格如下所示:

ID Column Value Description
1  Age    A     Age_20-30
2  Age    B     Age_30-50
3  Age    C     Age_50-75
4  Geo    A     Big_City
5  Geo    B     Suburbs
6  Geo    C     Rural_Town

等等.. 接下来,我的主数据框填充了列值。我想要做的是切换每列中的所有值及其相应的描述。

旧:

ID Age Geo
1  A   B
2  A   A
3  C   A
4  B   C
5  C   C

新:

ID Age       Geo
1  Age_20-30 Suburbs
2  Age_20-30 Big_City
3  Age_50-75 Big_City
4  Age_30-50 Rural_Town
5  Age_50-75 Rural_Town

现在我知道如何使用以下方法对一列执行此操作(其中 lookup_df 是我的一列的表):

old <- lookup_df$Value
new <- lookup_df$Description
df$Age <- new[match(df$Age, old, nomatch = 0)]

但我正在努力为所有专栏做到这一点。我的全套数据有 >100 列,因此为每一列手动执行此操作并不是一个真正的选择(至少在效率方面)。任何朝着正确方向的帮助或指示都会有很大的帮助。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我们可以将第一个数据集split 放入一个命名向量列表中。用它来匹配和替换第二个数据集

    lst1 <- lapply(split(df1[c('Value', 'Description')], df1$Column), 
              function(x) setNames(x$Description, x$Value))
    df2[-1] <- Map(function(x, y) y[x], df2[-1], lst1)
    

    -输出

    df2
    # ID       Age        Geo
    #1  1 Age_20-30    Suburbs
    #2  2 Age_20-30   Big_City
    #3  3 Age_50-75   Big_City
    #4  4 Age_30-50 Rural_Town
    #5  5 Age_50-75 Rural_Town
    

    数据

    df1 <- structure(list(ID = 1:6, Column = c("Age", "Age", "Age", "Geo", 
    "Geo", "Geo"), Value = c("A", "B", "C", "A", "B", "C"), 
    Description = c("Age_20-30", 
    "Age_30-50", "Age_50-75", "Big_City", "Suburbs", "Rural_Town"
    )), class = "data.frame", row.names = c(NA, -6L))
    
    df2 <- structure(list(ID = 1:5, Age = c("A", "A", "C", "B", "C"), Geo = c("B", 
    "A", "A", "C", "C")), class = "data.frame", row.names = c(NA, 
    -5L))
    

    【讨论】:

      【解决方案2】:

      要对具有大量列的数据执行此操作,您可以获取长格式数据,将其与第一个数据帧连接,然后(如果需要)以宽格式返回。

      library(dplyr)
      library(tidyr)
      
      df2 %>%
        pivot_longer(cols = -ID) %>%
        left_join(df1 %>% select(-ID), 
                   by = c('name' = 'Column', 'value' = 'Value')) %>%
        select(-value) %>%
        pivot_wider(names_from = name, values_from = Description)
      
      #     ID Age       Geo       
      #  <int> <chr>     <chr>     
      #1     1 Age_20-30 Suburbs   
      #2     2 Age_20-30 Big_City  
      #3     3 Age_50-75 Big_City  
      #4     4 Age_30-50 Rural_Town
      #5     5 Age_50-75 Rural_Town
      

      【讨论】:

        猜你喜欢
        • 2020-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-07
        相关资源
        最近更新 更多