从长到宽 - 重复列
Long to wide - Repeating columns
我已经在此站点和 Google 上搜索了 Tidyr 和 Dplyr 标签大约两天,最终决定 post 出于沮丧....
我有以下数据框:
Name Date Sheets Location Weekday_vs_weekend Cost
Jake Aug 28 2 House Weekday .18
Jake Aug 28 1 House Weekday .09
Kobe Aug 28 3 Park Weekend .27
Kobe Aug 28 2 Park Weekend .18
Jake Aug 29 1 Library Weekend .09
Jordan Aug 29 8 Library Weekend .72
Jordan Aug 29 4 Library Weekday .36
我希望将日期变量转换为列(我可以使用 spread() 执行此操作,通过 aggregate() 提供总成本和工作表的总和,使用每个日期工作表列的总和作为日期变量转换为列后要使用的值,然后为日期列中的每个日期重复剩余变量。
Name Aug 28 Cost Location WkDay_WkEnd Aug 29 Cost Location WkDay_WkEnd
Jake 3 27 House Weekday 1 .09 Library Weekday
Kobe 5 45 Park Weekday NA NA NA NA
Jordan NA NA NA NA 12 1.08 Library Weekend
这是使用 data.table
包的可能方法。虽然我看不出你打算如何使用这么宽的格式。
这里的想法是对数字列求和,然后对非数字列求和 运行 unique
,然后在两者之间进行简单连接
在此类数据集上使用 tidyr
的主要问题是 spread
没有 fun.aggregate
属性
library(data.table) # V 1.9.6+
indx <- sapply(df[names(df)[-(1:2)]], is.numeric)
DT1 <- dcast(setDT(df),
Name ~ Date,
value.var = names(df)[-(1:2)][indx],
sum,
fill = NA)
DT2 <- dcast(df,
Name ~ Date,
value.var = names(df)[-(1:2)][!indx],
unique,
fill = NA)
DT1[DT2, on = "Name"]
# Name Sheets_sum_Aug 28 Sheets_sum_Aug 29 Cost_sum_Aug 28 Cost_sum_Aug 29 Location_unique_Aug 28 Location_unique_Aug 29
# 1: Jake 3 1 0.27 0.09 House Library
# 2: Jordan NA 12 NA 1.08 NA Library
# 3: Kobe 5 NA 0.45 NA Park NA
# Weekday_vs_weekend_unique_Aug 28 Weekday_vs_weekend_unique_Aug 29
# 1: Weekday Weekend
# 2: NA Weekday
# 3: Weekend NA
我已经在此站点和 Google 上搜索了 Tidyr 和 Dplyr 标签大约两天,最终决定 post 出于沮丧....
我有以下数据框:
Name Date Sheets Location Weekday_vs_weekend Cost
Jake Aug 28 2 House Weekday .18
Jake Aug 28 1 House Weekday .09
Kobe Aug 28 3 Park Weekend .27
Kobe Aug 28 2 Park Weekend .18
Jake Aug 29 1 Library Weekend .09
Jordan Aug 29 8 Library Weekend .72
Jordan Aug 29 4 Library Weekday .36
我希望将日期变量转换为列(我可以使用 spread() 执行此操作,通过 aggregate() 提供总成本和工作表的总和,使用每个日期工作表列的总和作为日期变量转换为列后要使用的值,然后为日期列中的每个日期重复剩余变量。
Name Aug 28 Cost Location WkDay_WkEnd Aug 29 Cost Location WkDay_WkEnd
Jake 3 27 House Weekday 1 .09 Library Weekday
Kobe 5 45 Park Weekday NA NA NA NA
Jordan NA NA NA NA 12 1.08 Library Weekend
这是使用 data.table
包的可能方法。虽然我看不出你打算如何使用这么宽的格式。
这里的想法是对数字列求和,然后对非数字列求和 运行 unique
,然后在两者之间进行简单连接
在此类数据集上使用 tidyr
的主要问题是 spread
没有 fun.aggregate
属性
library(data.table) # V 1.9.6+
indx <- sapply(df[names(df)[-(1:2)]], is.numeric)
DT1 <- dcast(setDT(df),
Name ~ Date,
value.var = names(df)[-(1:2)][indx],
sum,
fill = NA)
DT2 <- dcast(df,
Name ~ Date,
value.var = names(df)[-(1:2)][!indx],
unique,
fill = NA)
DT1[DT2, on = "Name"]
# Name Sheets_sum_Aug 28 Sheets_sum_Aug 29 Cost_sum_Aug 28 Cost_sum_Aug 29 Location_unique_Aug 28 Location_unique_Aug 29
# 1: Jake 3 1 0.27 0.09 House Library
# 2: Jordan NA 12 NA 1.08 NA Library
# 3: Kobe 5 NA 0.45 NA Park NA
# Weekday_vs_weekend_unique_Aug 28 Weekday_vs_weekend_unique_Aug 29
# 1: Weekday Weekend
# 2: NA Weekday
# 3: Weekend NA