我有一个数据框。一列包含以下值:
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或有其他方式吗?
答案 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
时,您可能必须修改数据类型以确保正确合并。
最佳, 奥列格