代码之家  ›  专栏  ›  技术社区  ›  NelsonGon phoxis

将列分成两列r

  •  2
  • NelsonGon phoxis  · 技术社区  · 7 年前

    为了简单起见,我需要将一列拆分为两行,并沿行拆分。 以下是一些虚拟数据:

    structure(list(id = structure(1:8, .Label = c("A1", "A2", "A3", 
    "A4", "B1", "B2", "B3", "B4"), class = "factor"), value = c(0.360828393837437, 
    0.671899559209123, 0.905935228336602, 0.934275768464431, 0.450348142534494, 
    0.99131133640185, 0.696797786746174, 0.104902224382386)), class = "data.frame", row.names = c(NA, 
    -8L))
    

    伪随机数据

      id     value
    1 A1 0.3608284
    2 A2 0.6718996
    3 A3 0.9059352
    4 A4 0.9342758
    5 B1 0.4503481
    6 B2 0.9913113
    7 B3 0.6967978
    8 B4 0.1049022
    

    现在我需要做的是从B1分解到B4。我可以使用 slice() 稍后再重新组合,但我希望学习如何在一行中完成这一点。 提前感谢,如果这样的问题已经存在,请道歉,因为找不到它。

    1 回复  |  直到 7 年前
        1
  •  2
  •   markus    7 年前

    在里面 base R split Reduce

    out <- Reduce(cbind, split(dummy_data, substr(dummy_data$id, 1, 1)))
    names(out) <- make.names(names(out), unique = TRUE)
    out
    #  id     value id.1   value.1
    #1 A1 0.3608284   B1 0.4503481
    #2 A2 0.6718996   B2 0.9913113
    #3 A3 0.9059352   B3 0.6967978
    #4 A4 0.9342758   B4 0.1049022
    

    其思想是按列的第一个字母分割数据 id ,这将返回一个列表。然后,我们使用 cbind .


    do.call 减少 makes.names 淘汰。

    do.call(cbind, split(dummy_data, substr(dummy_data$id, 1, 1)))
    #  A.id   A.value B.id   B.value
    #1   A1 0.3608284   B1 0.4503481
    #2   A2 0.6718996   B2 0.9913113
    #3   A3 0.9059352   B3 0.6967978
    #4   A4 0.9342758   B4 0.1049022