【问题标题】:How do I use a column from a dataframe in R to index another dataframe?如何使用 R 中数据框中的列来索引另一个数据框?
【发布时间】:2015-06-27 02:06:30
【问题描述】:

我有包含 2 列状态和月份的数据框 StateList。我有另一个数据框StateTemp,其中包含美国每个月每个州的平均温度。我正在尝试创建第三列StateList$Temp,它将根据索引到StateTemp 的StateList$State 和StateList$Month 的值从StateTemp 获取温度。请参阅下文以供参考。非常感谢任何帮助。

 head(StateList)
   STATE Month
1     FL   Jan
3     MD   Jan
4     MD   Jan
5     WI   Jan
6     UT   Jan
12    NY   Jan

第二个对象:

head(StateTemp)
     Jan   Feb   Mar   Apr   May   Jun   Jul   Aug   Sep   Oct   Nov   Dec
AL 44.29 48.04 55.47 61.99 69.89 76.75 79.87 79.04 73.88 63.08 54.10 46.85
AZ 42.27 46.24 51.03 57.63 66.01 75.51 80.19 78.50 72.52 61.61 49.64 42.51
AR 38.48 43.76 51.96 60.36 68.62 76.40 80.57 79.26 72.26 61.47 50.32 41.59
CA 45.14 48.51 51.76 56.50 63.11 70.18 75.32 74.62 69.97 61.56 51.17 44.98
CO 23.71 28.34 35.57 43.06 52.50 62.15 67.60 65.75 57.72 46.64 33.51 25.20
CT 25.96 28.43 36.94 47.07 57.77 66.29 71.52 69.77 61.68 50.60 41.43 31.13

【问题讨论】:

    标签: r indexing dataframe


    【解决方案1】:

    试试这个。它使用面向列的矩阵的能力来索引维度对象,使用这样的对象作为“[”函数的单个参数:

    > StateList$Temp <- StateTemp[ with( StateList, cbind( STATE, Month) ) ]
    > StateList
       STATE Month  Temp
    1     FL   Jan 44.29
    3     MD   Jan 42.27
    4     MD   Jan 42.27
    5     WI   Jan 23.71
    6     UT   Jan 45.14
    12    NY   Jan 38.48
    

    【讨论】:

    • 我喜欢 base R 中的这些解决方案!
    • 这就是我来这里的目的。基本的 R 语法非常优雅。
    • 它也会更快。在一项小任务上它不会很明显,但如果这是一项更重要的任务,它将显着提高效率。
    【解决方案2】:

    您可以重塑您的StateTemp 以获得您想要的(在此示例中使用dplyr 和tidyr):

    StateTemp <- read.table(text="     Jan   Feb   Mar   Apr   May   Jun   Jul   Aug   Sep   Oct   Nov   Dec
    AL 44.29 48.04 55.47 61.99 69.89 76.75 79.87 79.04 73.88 63.08 54.10 46.85
    AZ 42.27 46.24 51.03 57.63 66.01 75.51 80.19 78.50 72.52 61.61 49.64 42.51
    AR 38.48 43.76 51.96 60.36 68.62 76.40 80.57 79.26 72.26 61.47 50.32 41.59
    CA 45.14 48.51 51.76 56.50 63.11 70.18 75.32 74.62 69.97 61.56 51.17 44.98
    CO 23.71 28.34 35.57 43.06 52.50 62.15 67.60 65.75 57.72 46.64 33.51 25.20
    CT 25.96 28.43 36.94 47.07 57.77 66.29 71.52 69.77 61.68 50.60 41.43 31.13", header=TRUE)
    
    library(tidyr)
    library(dplyr)
    
    StateTemp %>%
      add_rownames(var="State") %>%
      gather(Month, Temp, -State)
    
    ## Source: local data frame [72 x 3]
    ## 
    ##    State Month  Temp
    ## 1     AL   Jan 44.29
    ## 2     AZ   Jan 42.27
    ## 3     AR   Jan 38.48
    ## 4     CA   Jan 45.14
    ## 5     CO   Jan 23.71
    ## 6     CT   Jan 25.96
    ## 7     AL   Feb 48.04
    ## 8     AZ   Feb 46.24
    ## 9     AR   Feb 43.76
    ## 10    CA   Feb 48.51
    ## ..   ...   ...   ...
    

    【讨论】:

      【解决方案3】:

      如果您喜欢更“传统”的方法:

      # state list that fits to the temparature data
      StateList <- data.frame( STATE = c( "AL", "CT", "CA", "AZ", "CO", "AR" ),
                         Month = c( "Jan", "Feb", "Mar", "Jan", "Jan", "Feb" ), 
                         stringsAsFactors = FALSE )
      
      # create column for temperature values
      StateList$Temp <- 0
      
      # fill it row by row
      for( i in 1 : length( StateList$STATE ) )
      {
        s <- StateList[ i, 1 ]     # get state name
        m <- StateList[ i, 2 ]     # get month name
        # find in matrix:
        StateList$Temp[ i ] <- StateTemp[ rownames( StateTemp ) == s, 
                                          colnames( StateTemp ) == m ]
      }
      
      # I guess this is what you want to see:
      StateList
        STATE Month  Temp
      1    AL   Jan 44.29
      2    CT   Feb 28.43
      3    CA   Mar 51.76
      4    AZ   Jan 42.27
      5    CO   Jan 23.71
      6    AR   Feb 43.76
      

      【讨论】:

        【解决方案4】:

        感谢大家的回复。 BondedDust 太棒了。 Vaetchen 您的解决方案也很棒。在我发布之后,我设法获得了一些带有 for 循环的代码,如下所示。 BondedDust 的解决方案比我的要优雅得多。我需要使用 [ 功能变得更好。 hrbrmstr 我应该更清楚地表达它我没有重塑 StateTemp 而是将第三列添加到具有 150K 行的两列数据框 StateList。 StateTemp 基本上是一个查找表来填充它。像往常一样,在 R 中似乎有上百种剥猫皮的方法。

        `for (i in 1:nrow(StateList)) { StateList$Temp[i]

        【讨论】:

          猜你喜欢
          • 2020-06-17
          • 1970-01-01
          • 2021-04-12
          • 2016-08-18
          • 2021-11-02
          • 1970-01-01
          • 2021-06-11
          • 2016-05-07
          • 1970-01-01
          相关资源
          最近更新 更多