用另一个数据框中的值替换数据框中某一列的值

3

我的情况是有一个数据框,其中一列填充了整数1到6。我想用另一个作为“键”的数据框中提供的更具描述性的标签替换这些整数:

  V1                 V2
1  1             LABEL1
2  2             LABEL2
3  3             LABEL3
4  4             LABEL4
5  5             LABEL5
6  6             LABEL6

每当我在第一列数据框(df$colX)中找到数字1时,我希望用LABEL1 (即标签列2中的内容,其中df$colX == 标签列1)来替换它。
我尝试过 replace(df$colX,labels[,1],labels[,2]) 但由于某些原因,这只是将整数变成了带引号的整数。
我可以用for循环来完成,但那似乎很慢。
我也按照StackOverflow上的建议尝试使用因子(factor),但我正在处理的所有列似乎都不涉及因子(使用stringsAsFactors = FALSE读取)。有什么想法吗?

1
我会使用 merge 来完成这个任务。 - Roland
谢谢。这几乎是我想要的。我想要替换列中的值,而不是在数据框上添加额外的列。 - Unstack
eh ... df$V1 <- df$V2 - tagoma
1个回答

4
您可以尝试使用match函数。
 df$colX <- labels[,2][match(df$colX, labels[,1])]

甚至以下内容也应该有效

 labels[,2][df$colX]
 #[1] "LABEL3" "LABEL5" "LABEL1" "LABEL6" "LABEL1" "LABEL6" "LABEL4" "LABEL3"
 #[9] "LABEL1" "LABEL2" "LABEL2" "LABEL3" "LABEL6" "LABEL4" "LABEL5" "LABEL1"
 #[17] "LABEL4" "LABEL5" "LABEL3" "LABEL5" "LABEL1" "LABEL3" "LABEL1" "LABEL1"
 #[25] "LABEL2"

数据

 labels <- structure(list(V1 = 1:6, V2 = c("LABEL1", "LABEL2", "LABEL3", 
 "LABEL4", "LABEL5", "LABEL6")), .Names = c("V1", "V2"), class = "data.frame", row.names = c("1", 
 "2", "3", "4", "5", "6"))

 set.seed(25)
 df <- data.frame(colX= sample(1:6,25, replace=TRUE), colY=rnorm(25))

@akrun,您知道如何更改match中的nomatch参数以不进行替换,即什么都不做吗? - mattbawn
1
@mattbawn 您可以使用 nomatch=0,而且在 R 中索引从 1 开始,所以无论何处出现 0,都应该省略。 - akrun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接