我有两个数据帧,第一个(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]
}
}
}
有没有办法更有效地做到这一点?!?!我知道有。我是个菜鸟。
答案 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)
})