【问题标题】:Replacing categorical values in a vector to numbers将向量中的分类值替换为数字
【发布时间】:2015-12-06 21:13:31
【问题描述】:

我有一个数据框

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

和带有行名的向量

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 和向量的长度不同。基本上,带有行名的向量本身就是一个地图。我想将向量中的行名与 t$V2 中的值匹配,并将其替换为向量的值。向量本身是使​​用 table(t$V2) 函数生成的。

【问题讨论】:

  • 大概你的意思是names(vector)(不是rownames(vector))在第3行
  • 我不确定,但我已经编辑了我的帖子以使其更清晰。
  • rownames(vector) 对我和@42 都产生错误(见下文)
  • 如果我使用 table() 函数从数据框生成向量,rownames 对我有用。
  • 是的,因为 vector 没有存储为向量 - 因此与帖子的原始版本不同:)

标签: r


【解决方案1】:

当我尝试执行rownames(vector) = c('a', 'b', 'c') 时出现错误。当目标只是一个原子向量时,rownames&lt;--function 不会成功。所以这也意味着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

【讨论】:

    【解决方案2】:

    这是你想要做的吗?

    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
    

    【讨论】:

      【解决方案3】:

      您的问题是数据框中感兴趣的列是类型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])]
      }
      

      【讨论】:

        猜你喜欢
        • 2021-09-27
        • 2020-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多