data.frame匹配

时间:2013-10-03 03:48:57

标签: r dataframe

我有一个简单的R问题。我有两个数据帧。第一个包含我可能的所有年份。我将NA分配给第二列。第二个数据框只有可能年份的子集,但是第二列的实际值。我想结合两个数据帧。更具体地说,我希望按年份匹配它们,如果第二年具有正确年份,则将第一个中的NA替换为第二个中的NA。

这是示例代码。

one <- as.data.frame(matrix(1880:1890, ncol=2, nrow=11))
one[,2] <- NA
two <- data.frame(ncol=2, nrow=3)
two[1,] <- c(1880, "a")
two[2,] <- c(1887, "b")
two[3,] <- c(1889, "c")

我想获得第一行,第二列的第一列具有值“a”,第八行,第二列为“b”,第十行,第二列为“c”。

随意使上述代码更优雅。

我尝试了一件事作为初步步骤,但它给出了一些奇怪的结果:

one[,1]==two[,1] -> test

但测试仅包含值1880和1887 ...

3 个答案:

答案 0 :(得分:3)

one[match(two[,1],one[,1]),2]<-two[,2]

那可以给你你想要的东西:

> one
     V1   V2
1  1880    a
2  1881 <NA>
3  1882 <NA>
4  1883 <NA>
5  1884 <NA>
6  1885 <NA>
7  1886 <NA>
8  1887    b
9  1888 <NA>
10 1889    c
11 1890 <NA>

答案 1 :(得分:2)

我喜欢使用merge来解决这些类型的问题。在我看来,它非常简单。查看帮助文章?merge

three <- merge(one, two, by.x = 'V1', by.y = 'ncol', all = T)

答案 2 :(得分:1)

这是一种方法(merge是另一种方法):

library(qdap)
one[, 2] <- lookup(one[, 1], two)
one

##      V1   V2
## 1  1880    a
## 2  1881 <NA>
## 3  1882 <NA>
## 4  1883 <NA>
## 5  1884 <NA>
## 6  1885 <NA>
## 7  1886 <NA>
## 8  1887    b
## 9  1888 <NA>
## 10 1889    c
## 11 1890 <NA>