【问题标题】:cbind makes values null in rcbind 使值在 r 中为空
【发布时间】:2012-11-20 05:59:29
【问题描述】:

我正在使用 cbind 将字符串和数字矩阵组合在一起,它会将所有数字列(除了第一列)返回为 NULL。这是示例代码:

nums <- matrix(data=c(1,2,3,4),ncol=2)
strs <- list()
strs[1] <- 'row1'
strs[2] <- 'row2'
result <- cbind(strs,nums)

> result
     strs         
[1,] "row1" 1 NULL
[2,] "row2" 2 NULL

我显然忽略了一些简单的事情。谢谢你的帮助,

【问题讨论】:

  • 你必须使用列表吗?如果你使用向量(例如c('row1', 'row2'),一切都很好。
  • 如果您对列表感到困惑,请尝试以下操作:result &lt;- data.frame(strs=unlist(strs),nums)
  • 太棒了——如果你把它写成@sebastian-c,我会很乐意接受这个作为答案。

标签: string r matrix


【解决方案1】:

在这种情况下,我认为您解决问题的方式有点错误。 cbind 返回一个矩阵。矩阵的限制之一是所有元素必须属于同一类型。这意味着您的 c(1, 2, 3, 4) 将在强制转换为矩阵时成为存在的最高级别数据类型(在本例中为来自 strs 的字符)并等效于 c("1", "2", "3", "4")

我将假设您有一个包含 2 个元素的列表 strs,并且您真正想要的是一个 data.frame(它能够容纳不同的类型)。

无论哪种情况,我们先将strs转换成一个字符:

strs2 <- unlist(strs)
[1] "row1" "row2"

请注意,这与您通过c("row1", "row2") 创建的相同。 接下来,我们将创建一个 data.frame:

result <- data.frame(strs2, nums)
  strs2 X1 X2
1 row1   1  3
2 row2   2  4

这与@thelatemail 提供的解决方案基本相同。

【讨论】:

    【解决方案2】:

    将列表与cbind() 组合可能会出现问题。我会按照 sebastian-c 在 cmets 中所说的那样做,或者首先在 strs 上使用 unlist()

    cbind(unlist(strs), nums)
    

    或者直接使用matrix():

    matrix(c(strs, nums), ncol = 3)
    

    如果nums 的列数可变:

    matrix(c(strs, nums), ncol = ncol(nums) + 1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 2022-07-07
      • 2013-03-20
      相关资源
      最近更新 更多