r - 在 R 中重塑分段数据帧
问题描述
如何重塑数据框,其中数据排列在“块”中,宽度为 x 列,长度为 Y 行。在此示例图中,起始数据帧为两个“块”宽和三个“块”长,但该解决方案也应适用于其他维度。最后的“块”可能有更少的行。此数据结构是从此处发布的解决方案中获得的: Split dataframe at specifi row and Arrange columns into "sections" in R
我尝试使用 reshape() 将其重塑为长格式,但无法弄清楚如何重新排列“块”。
x=2 的样本数据;y=6 和两个“块”宽和两个“块”长:
index v1 index v1
1 a 7 a
2 a 8 a
3 d 9 x
4 f 10 d
5 f 11 d
6 g 12 x
13 e 19 e
14 a 20 e
15 a 21 c
16 d
17 c
18 f
预期输出:
index v1
1 a
2 a
3 d
4 f
5 f
6 g
7 a
8 a
9 x
10 d
11 d
12 x
13 e
14 a
15 a
16 d
17 c
18 f
19 e
20 e
21 c
解决方案
R 代表 wusses。我们只写C。
reblock <- function (data, x, y) {
cols <- as.list(data) # ncol items, each length nrow
reblocked <- as.data.frame(matrix(NA, 0, x))
rn <- names(data)[seq_len(x)]
names(reblocked) <- rn
while (nrow(data) >= y) {
rows <- data[seq_len(y), ]
while (ncol(rows) >= x) {
names(rows)[seq_len(x)] <- rn
reblocked <- rbind(reblocked, rows[seq_len(x)])
rows <- rows[-seq_len(x)]
}
# remove x,y block
data <- data[-seq_len(y), ]
}
reblocked
}
tmp <- data.frame(
a = rep(1:4, each = 6),
b = rep(letters[1:4], each = 6),
c = rep(5:8, each = 6),
d = rep(letters[5:8], each = 6)
)
reblock(tmp, 2 ,6)
推荐阅读
- xslt - 使用 XSLT 从 XML 元素中获取多个属性值
- java - Liferay DXP 7 使用远程 EJB,java.rmi.UnmarshalException:加载失败返回类型:类 java.lang.Object
- database - 我想在 VB.net 中更新我的数据库数据,但我得到错误语法
- sql-job - SQL 作业 Excel 导入行限制
- python - pygame.error:视频系统未初始化(pycharm)
- python-3.x - 熊猫:从宽到长的转换:如何获取行号和列号
- maven - 如何告诉 mvn archetype:generate 列出部分原型?
- java - 将所有 Maven 库批量添加到 IntelliJ 中的类路径
- javascript - 如何在 UserId 前面设置 userName(在顶部父键处)
- python-3.x - 试试,除了,回来试试?