R - 批量柱值替换

时间:2015-07-07 22:23:53

标签: r

在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')

3 个答案:

答案 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