我有一个数据框
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)函数生成的。
答案 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])]
}