首页 > 解决方案 > 折叠数据框,创建名称为另一列的唯一值的新列,并根据另一列的值创建值?在 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

提前致谢!非常感谢任何帮助。

标签: rdplyrdata.tabletidyversetidyr

解决方案


您想使用该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 更容易理解。


推荐阅读