如何用查找列表中的新值替换现有值而不会导致NA?

时间:2016-02-14 05:50:10

标签: r lookup

我有一个数据框。一列包含以下值:

df$current_column=(A,B,C,D,E)

向量包含查找值:

v <- c(A=X, B=Y)

我想替换此列以提供(X,Y,C,D,E)列表

我正在考虑创建一个像

这样的新列
df$new_column <- v[df$current_column]

它取代了A和B,但它也使C,D,E成为NA(X,Y,NA,NA,NA)。

如何保留C,D和E或有其他方式吗?

3 个答案:

答案 0 :(得分:0)

看起来像ifelse()可以帮助:

d$current_column <- ifelse( d$current_column == A, X, 
                    ifelse( d$current_column == B, Y, d$current_column ))

答案 1 :(得分:0)

我们可以使用%in%创建逻辑索引,然后执行转换

i1 <- df$current_column %in% names(v)
df$new_column <- df$current_column
df$new_column[i1] <- v[df$new_column[i1]]
df$new_column
#[1] "X" "Y" "C" "D" "E"

或使用单个ifelse

 with(df, ifelse(current_column %in% names(v), 
                   v[current_column], current_column))

更新

如果&#39; current_column&#39;是factor类,转换为character类,它应该可以工作。

 df$new_column <- as.character(df$current_column)
 df$new_column[i1] <- v[df$new_column[i1]]

数据

df <- data.frame(current_column = LETTERS[1:5], 
                              stringsAsFactors=FALSE)
v <- setNames(c('X', 'Y'), LETTERS[1:2])

答案 2 :(得分:0)

user2029709,

- 正在处理你的小例子;对于更通用的方法,很高兴看到真实数据或密切模拟的片段。在任何情况下,这里都可以为您提供更好的帮助,无需手动编写所有ifelse()个选项,并且仍然是一个相对简单的解决方案:

vd <- data.frame(current_column = names(v), new_column = v, stringsAsFactors = FALSE)
df <- merge(df, vd, by = 'current_column', all.x = TRUE)
df$new_column <- ifelse(is.na(df$new_column), df$current_column, df$current_column)

在创建vd data.frame时,您可能必须修改数据类型以确保正确合并。

最佳, 奥列格