【问题标题】:Creating table with different row dimensions创建具有不同行尺寸的表
【发布时间】:2011-08-24 17:36:55
【问题描述】:

假设我有一张这样的桌子:

data <- c(1,2,3,6,5,6,9,"LC","LC","HC","HC","LC","HC","ALL")
attr(data,"dim") <- c(7,2)
data
     [,1] [,2] 
[1,] "1"  "LC" 
[2,] "2"  "LC" 
[3,] "3"  "HC" 
[4,] "6"  "HC" 
[5,] "5"  "LC" 
[6,] "6"  "HC" 
[7,] "9"  "ALL"

现在我想操作数据,使其看起来像这样:

     [,"LC"] [,"HC"] [,"ALL"] 
[1,] "1"     "3"     "9"
[2,] "2"     "6"
[3,] "5"     "6" 

有没有办法在 R 中做到这一点,或者这是不可能的,我应该尝试另一种方式来访问我的数据吗?

【问题讨论】:

  • data.framematrix(和 array)具有预定义的形状 (n*m)。只是把它更明确地放在那里。

标签: r row dimensions


【解决方案1】:

您可以使用split 非常接近。这将返回一个包含您想要的值的列表,然后您可以使用 lapply 或任何其他列表操作函数:

split(data[, 1], data[, 2])

$ALL
[1] "9"

$HC
[1] "3" "6" "6"

$LC
[1] "1" "2" "5"

如果你必须有矩阵格式的输出,那么我建议你用 NA 填充短向量:

x <- split(data[, 1], data[, 2])
n <- max(sapply(x, length))

pad_with_na <- function(x, n, padding=NA){
  c(x, rep(padding, n-length(x)))
}

sapply(x, pad_with_na, n)

这会导致:

     ALL HC  LC 
[1,] "9" "3" "1"
[2,] NA  "6" "2"
[3,] NA  "6" "5"

【讨论】:

  • 第一个拆分函数正是我想要的。非常感谢
【解决方案2】:

示例数据

我更喜欢将数据读入 data.frame,因为它会检查向量是否相等。

data <- data.frame(X=c(1,2,3,6,5,6,9), 
                   Y=c("LC","LC","HC","HC","LC","HC","ALL"))

代码

data <- unstack(data, form=X~Y)# easier to read than split
Nmax <- do.call(max, lapply(data,length))
sapply(data, "[", seq(Nmax))# "borrowed" from other answer in SO

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    • 2011-10-17
    • 2019-12-11
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多