将向量中的分类值替换为数字

时间:2015-12-06 21:13:32

标签: r

我有一个数据框

t = data.frame(c(5,5,5), c('a','b','c', 'a', 'b', 'd'), c(1,2,3), c(1,2,3))

带有rownames的矢量

vector = table(t$V2)

如何使用向量中的数字替换数据框中的第二个分类列?

我做了一些google foo并尝试执行以下操作:

map = setNames(vector, rownames(vector))
to_replace = t$V2
to_replace[] = map[unlist(map)]

但是我收到了一个错误:

Warning message:
In `[<-.factor`(`*tmp*`, , value = c(146L, 146L, 27L, 82L, 110L,  :
  invalid factor level, NA generated

修改

对不起伙计们,我没说清楚我想做什么

t $ V2和向量具有不同的长度。基本上带有rownames的向量本身就是一个地图。我想将向量中的rownames与t $ V2中的值匹配,并将其替换为vector的值。 Vector本身是使用table(t $ V2)函数生成的。

3 个答案:

答案 0 :(得分:0)

当我尝试执行rownames(vector) = c('a', 'b', 'c')时,我收到了错误消息。当目标只是一个原子向量时,rownames<- - 函数将不会成功。这也意味着map = setNames(vector, rownames(vector))不会成功,所以我们需要这样做:

map = setNames(vector, c('a', 'b', 'c'))  # success

但是现在我们还有另外一个问题,因为你没有告诉我们对结果的期望是什么,而且map[unlist(map)]并不是真正明智的分配:

> map[unlist(map)]   # there are no 4 or 6 positon in `vector` or `map`
   b <NA> <NA> 
   4   NA   NA 

如果您只想用该数字向量替换V2,那么它只是

t$V2 <- vector

答案 1 :(得分:0)

这是你想要做的吗?

t = data.frame(v1 = c(5,5,5), v2 = c('a','b','c'), v3 = c(1,2,3), v4 = c(1,2,3))
vector = c(2,4,6)
row.names(t) <- vector

print(t)
# Output from print(t)
  v1 v2 v3 v4
2  5  a  1  1
4  5  b  2  2
6  5  c  3  3

答案 2 :(得分:0)

您的问题是数据框中的交集列是类型factor。使用和不使用散列线检查以下代码。

t <- data.frame(c(5,5,5), c('a','b','c'), c(1,2,3), c(1,2,3))
vector <- c(2,4,6,8)
names(vector) <- c('a', 'b', 'c', 'd')

# t[,2] <- as.character(t[,2])

for(i in 1:dim(t)[1]){
  t[i,2] <- vector[which(names(vector)==t[i,2])]
}