【问题标题】:Separate column into two columns r将列分成两列 r
【发布时间】:2018-12-15 12:01:22
【问题描述】:

为了直截了当,我需要将一列拆分为沿行拆分的两列。 这是一些虚拟数据:

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() 来做到这一点,并在以后重新组合它们,但我希望学习如何在单行中做到这一点。 提前感谢并道歉,如果这样的问题已经存在,找不到它。

【问题讨论】:

    标签: r tidyr


    【解决方案1】:

    在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 而不是Reduce,因为这会给出唯一的名称,并且会废弃对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
    

    【讨论】:

    • 只是为了澄清,为什么在substr中使用1,1?!
    • 是开始和停止的列号吗?
    • 这是ID 列中条目的第一个字母。试试substr(dummy_data$id, 1, 1),你会看到的。
    猜你喜欢
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多