如何使用R中的数据框中的列来索引另一个数据帧?

时间:2015-06-27 02:06:31

标签: r indexing dataframe

我有数据帧StateList,有2列STATE和Month。我有另一个数据框StateTemp,其中包含美国每个州每个州的平均临时温度。我正在尝试创建第三列StateList$Temp,它将根据索引到StateTemp中的StateList$StateStateList$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

4 个答案:

答案 0 :(得分:4)

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

> 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

答案 1 :(得分:1)

您可以重塑StateTemp以获得您想要的内容(在此示例中使用dplyr&amp; 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
## ..   ...   ...   ...

答案 2 :(得分:0)

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

# 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

答案 3 :(得分:0)

感谢大家的回复。 BondedDust很棒。 Vaetchen你的解决方案也很棒。我发布后,我设法得到一些代码与for循环工作如下。 BondedDust的解决方案比我的更优雅。我需要通过[功能来改善。 hrbrmstr我shuld已经更明确地表达了我没有重塑StateTemp,而是将第三列添加到具有150K行的两列数据帧StateList。 StateTemp基本上是一个填充它的查找表。像往常一样,在R中似乎有超过一百种方法给猫皮肤。

`for(i in 1:nrow(StateList)){     StateList $ Temp [i]&lt; -StateTemp [StateList $ STATE [i],StateList $ Month [i]] }“