r - 将 2 级数据重构为 3 级数据
问题描述
我有一个两级多级数据。下面是一个例子。我有两个参与者报告了他们两天的水果消费情况。
id day apple orange
1 1 34 12
1 2 54 43
2 1 65 56
2 2 87 81
我想将数据框从 2 级数据重组为 3 级数据。我想 a) 为水果类型创建一个变量;b) 在一列中以天为单位的巢果消费量。所以数据框如下所示:
id day fruit_type fruit_consumption
1 1 apple 34
1 1 orange 12
1 2 apple 54
1 2 orange 43
2 1 apple 65
2 1 orange 56
2 2 apple 87
2 2 orange 81
解决方案
如果您指的是 Python,pandas
DataFrame
那么我已经为它编写了下一个解决方案,有点通用,不仅适用于需要重新排列的两列 apple/orange,而且适用于任意数量的列,通过crng
在开头指定范围来控制脚本。应该可以快速工作,因为它使用简单numpy
的少量 python 循环迭代。
您也可以在这里在线尝试下一个代码!.
import pandas as pd, numpy as np
crng = (2, 4) # Range of columns for rearranging
df = pd.DataFrame([map(int, line.split()) for line in """
1 1 34 12
1 2 54 43
2 1 65 56
2 2 87 81
""".splitlines() if line.strip()], columns = ['id', 'day', 'apple', 'orange'])
print('input:\n', df)
a = df.values
b = np.zeros((a.shape[0], crng[1] - crng[0], crng[0] + 2), dtype = np.object_)
for icol, col in enumerate(df.columns[crng[0] : crng[1]]):
b[:, icol, 0] = a[:, 0]
b[:, icol, 1] = a[:, 1]
b[:, icol, 2] = df.columns[crng[0] + icol]
b[:, icol, 3] = a[:, crng[0] + icol]
b = b.reshape((b.shape[0] * b.shape[1], b.shape[2]))
df = pd.DataFrame(data = b,
columns = df.columns[:crng[0]].values.tolist() + ['fruit_type', 'fruit_consumption'],
)
print('output:\n', df)
推荐阅读
- java - Java:PrintWriter 未写入文件
- c# - 如何在 Hostgator 上托管 ASP.NET MVC 网站
- python - 类型错误:strptime() 参数 1 必须是 str,而不是列表
- excel - 在 Word 宏中返回 Excel 行
- javascript - 就时间效率而言,在 store(model) 和 class 中存储状态有什么区别?
- llvm - 在指针中存储双精度时访问错误——llvm IR
- c# - 制作了一个nuget包,安装在一个项目上,但现在它没有出现在参考列表中
- sql - 在sql中的选择查询中有条件地自动将列值增加1
- c# - 能够存储在 IHttpContextAccessor.HttpContext.Session - 检索为空
- r - 用户上传数据的数据操作 - Shiny