R - 使用字符标签在“列中查找并替换”整数

时间:2014-06-18 22:56:29

标签: r for-loop apply

我有两个数据帧,第一个(DF1)与此类似:

Ba    Ram    You    Sheep
30      1   33.2    120.9
27      3   22.1    121.2
22      4   39.1     99.1
11      1   20.0    101.6
 9      3    9.8    784.3

第二个(DF2)包含“Ram”列的标题:

V1    V2
 1   RED
 2   GRN
 3   YLW
 4   BLU

我需要用DF2 $ V2的相应字符串替换DF1 $ Ram:

Ba    Ram    You    Sheep
30    RED   33.2    120.9
27    YLW   22.1    121.2
22    BLU   39.1     99.1
11    RED   20.0    101.6
 9    YLW    9.8    784.3

我可以使用嵌套的for循环执行此操作,但感觉真的很低效:

x <- c(1:nrows(DF1))
y <- c(1:4)
for (i in x) {
    for (j in y) {
        if (DF1$Ram[i] == x) {
            DF1$Ram[i] <- DF2$V2[y]
        }
    }
}

有没有办法更有效地做到这一点?!?!我知道有。我是个菜鸟。

2 个答案:

答案 0 :(得分:1)

使用merge

> result <- merge(df1, df2, by.x="Ram", by.y="V1")[,-1] # merging data.frames
> colnames(result)[4] <- "Ram"  # setting name

以下只是按照您向我们展示的顺序获取输出

> result[order(result$Ba, decreasing = TRUE), c("Ba", "Ram", "You", "Sheep")]
  Ba Ram  You Sheep
1 30 RED 33.2 120.9
3 27 YLW 22.1 121.2
5 22 BLU 39.1  99.1
2 11 RED 20.0 101.6
4  9 YLW  9.8 784.3

答案 1 :(得分:1)

通常,当您使用整数对某些字符串进行编码时,您可能需要因子。它们提供了一些您可以在精细手册中阅读的好处。

df1 <- data.frame(V2 = c(3,3,2,3,1))
df2 <- data.frame(V1=1:4, V2=c('a','b','c','d'))

df1 <- within(df1, {
  f <- factor(df1$V2, levels=df2$V1, labels=df2$V2)
  aschar <- as.character(f)
  asnum <- as.numeric(f)
  })