r - 将列分成两列 r

标签 r tidyr

简单来说,我需要将一列分成两行。 这是一些虚拟数据:

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() 来完成此操作,并稍后重新组合它们,但我希望了解如何在一行中完成此操作。 提前致谢,如果这样的问题已经存在,但找不到它,我们深表歉意。

最佳答案

base R中,您可以使用splitReduce

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

关于r - 将列分成两列 r,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53792158/

相关文章:

r - 是否有更优雅的方法将参差不齐的数据转换为整洁的数据框

r - "Multi-step"在 R 中使用 broom 和 dplyr 进行回归

r - 使用 tidyr unnest 和 NULL 值

r - 如何绘制方程 (x^2+y^2-1)^3=x^2*y^3?

R:用日期列变量中的固定日期替换 NA(如果条件成立)

javascript - R Shiny : Change "height" attribute of rectangle in gvisTimeline

r - 将 tibbles 存储在 tibbles 中

R 跳过/dev/stdin 中的行

r - 将 getSymbols 结果合并到一个 xts 对象中

r - 在 R 中旋转具有重复行的数据