r - 折叠数据框,创建名称为另一列的唯一值的新列,并根据另一列的值创建值?在 R 中
问题描述
我有一个带有大量变量(数字和字符)的数据框(将其称为“ df ”)。其中一列包含特定人在一天中的给定时间消耗的水量,其他一些列根本不相关。每行代表一个观察。
假设这是我的数据框(我已经过分简化并发明了用水量方面的问题 -保持水分- 为了让我的问题更清楚):
df <- structure(list(Name = structure(c(1L, 1L, 1L, 3L, 3L, 2L, 3L,
2L, 2L), .Label = c("Ana", "David", "Roger"), class = "factor"),
Time = structure(c(3L, 1L, 2L, 2L, 3L, 2L, 1L, 1L, 3L), .Label = c("afternoon",
"evening", "morning"), class = "factor"), Water_consumed = c(1,
0.75, 0.5, 0.7, 0.7, 0.2, 1.2, 1, 0.6)), class = "data.frame", row.names = c(NA,
-9L))
### Name Time Water_consumed
### Ana morning 1.00
### Ana afternoon 0.75
### Ana evening 0.50
### Roger evening 0.70
### Roger morning 0.70
### David evening 0.20
### Roger afternoon 1.20
### David afternoon 1.00
### David morning 0.60
我想创建n 个新列(n是“时间”列中存在的唯一值的数量),它们的名称基于“时间”列的值,它们的值基于“水消耗”列的值. 有了这个,我希望删除多余的行和列。
所以我希望像这样的输出,一个已被“名称”折叠的数据框,旧列“时间”和“水消耗”已被删除(因为它们现在是多余的,因为已经创建了三个新列持有相同的信息)。
### Name Consumed_morning Consumed_afternoon Consumed_evening
### Ana 1.00 0.75 0.50
### Roger 0.70 1.20 0.70
### David 0.60 1.00 0.20
提前致谢!非常感谢任何帮助。
解决方案
您想使用该spread
功能来执行此操作。
df <- spread(df, Time, Water_consumed)
columns <- colnames(df)
n <- length(columns)
columns[2:n] <- paste("Consumed_", columns[2:n], sep = "")
检查备忘单以节省您在 stackoverflow 中潜水的时间,特别是与 tidyverse 相关的那些。我认为它比 DataTable 更容易理解。
推荐阅读
- regex - Vim:在数字和左括号之间添加 * 符号
- c++ - STD::Tuple 实现 C++
- python - 与 Python 的 TCP/IP 连接,.recv() 没有任何回报
- python - 从 Python 程序中的 Pyspark SQL 数据框中检索值
- json - django rest api json 数据类别子类别
- python - Python - 回归问题的 cross_val_score 不起作用 - “ValueError:不支持连续”
- google-bigquery - 是否可以从基于数据访问日志的查询中使用的视图中提取输出字节数和已处理字节数?
- c++ - 如何在没有 if 语句的情况下从最小到最大排序一组整数?
- c# - 将 userID 传递到同一个表和另一个表的列中
- node.js - 通过从路由发送动态引用