在R中我有一个data.frame,我想进行批量更新。
我的表格似乎是
Col1 Col2 Col3
A 123 456
A 789 012
B 345 678
B 789 012
我想扫描表格并将A
替换为"Apple"
,将B
替换为"Banana"
在我的情况下,替换列表很长(约30项)所以我将它们都放在以下列表中:
old<-c('A','B')
new<-c('Apple','Banana')
答案 0 :(得分:3)
我喜欢使用命名向量:
df <- data.frame(Col1=c('A','A','B','B'),
Col2=c(123,789,345,789),
Col3=c(456,012,678,012))
oldv <- c('A','B')
newv <- c('Apple','Banana')
names(newv) <- oldv
df$Col1 <- newv[ df$Col1 ]
产量
> df
Col1 Col2 Col3
1 Apple 123 456
2 Apple 789 12
3 Banana 345 678
4 Banana 789 12
答案 1 :(得分:2)
您还可以使用lookup()
中的qdapTools
:
ref <- data.frame(old = c("A", "B"),
new = c("Apple", "Banana"))
library(qdapTools)
df$Col1 <- lookup(df, ref)
或者,如果您更喜欢语法,则可以使用%l%
运算符:
df$Col1 <- df %l% ref
或使用基础R:
df$Col1 <- ref$new[match(df$Col1, ref$old)]
给出了:
# Col1 Col2 Col3
#1 Apple 123 456
#2 Apple 789 12
#3 Banana 345 678
#4 Banana 789 12
答案 2 :(得分:1)
由于我试图在审美理由上避免使用for循环,因此感觉有点混乱:
dat$Col1 <- as.character(dat$Col1)
for ( i in seq_along(old) ) {dat$Col1 [ dat$Col1 == old[i] ] <- new[i] }
> dat
Col1 Col2 Col3
1 Apple 123 456
2 Apple 789 12
3 Banana 345 678
4 Banana 789 12