1

我有一个简单的 R 问题。我有两个数据框。第一个包含我所有可能的年份。我将 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...

4

3 回答 3

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>
于 2013-10-03T03:56:42.393 回答
2

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

three <- merge(one, two, by.x = 'V1', by.y = 'ncol', all = T)
于 2013-10-03T04:59:01.097 回答
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>
于 2013-10-03T03:56:23.627 回答