R 一次重塑多个值
我有一个很长的数据集,我想广泛使用,我很好奇是否有一种方法可以使用R中的Reformae2或tidyr包一步完成这一切 数据帧df如下所示:R 一次重塑多个值,r,dataframe,reshape,reshape2,tidyr,R,Dataframe,Reshape,Reshape2,Tidyr,我有一个很长的数据集,我想广泛使用,我很好奇是否有一种方法可以使用R中的Reformae2或tidyr包一步完成这一切 数据帧df如下所示: id type transactions amount 20 income 20 100 20 expense 25 95 30 income 50 300 30 expense 45 250 我想说的是: id i
id type transactions amount
20 income 20 100
20 expense 25 95
30 income 50 300
30 expense 45 250
我想说的是:
id income_transactions expense_transactions income_amount expense_amount
20 20 25 100 95
30 50 45 300 250
我知道我可以通过以下方式实现部分目的:
dcast(df, id ~ type, value.var="transactions")
但是有没有一种方法可以一次性改变整个df,同时处理“交易”和“金额”变量?理想情况下,使用新的更合适的列名?在“重塑2”中,您可以使用重铸
(尽管根据我的经验,这不是一个广为人知的功能)
您还可以使用基本R的重塑:
reshape(mydf, direction = "wide", idvar = "id", timevar = "type")
# id transactions.income amount.income transactions.expense amount.expense
# 1 20 20 100 25 95
# 3 30 50 300 45 250
或者,您可以melt
和dcast
,就像这样(这里有“data.table”):
在“数据表”(1.9.8)的dcast.data.table
的更高版本中。如果我理解正确的话,@Arun试图实现的是在不必首先融化数据的情况下进行重塑,这就是目前使用重铸时发生的情况,它本质上是一个melt
+dcast
操作序列的包装器
为了彻底起见,这里有tidyr
方法:
library(dplyr)
library(tidyr)
mydf %>%
gather(var, val, transactions:amount) %>%
unite(var2, type, var) %>%
spread(var2, val)
# id expense_amount expense_transactions income_amount income_transactions
# 1 20 95 25 100 20
# 2 30 250 45 300 50
使用data.table v1.9.6+,我们可以同时强制转换多个value.var
列(还可以在fun.aggregate
中使用多个聚合函数)。有关更多信息以及示例部分,请参见?dcast
require(data.table) # v1.9.6+
dcast(dt, id ~ type, value.var=names(dt)[3:4])
# id transactions_expense transactions_income amount_expense amount_income
# 1: 20 25 20 95 100
# 2: 30 45 50 250 300
这是一个不错的答案(开明+不错的答案徽章在路上…),但不确定我们需要什么,所有这些乱七八糟的tidyr
,dplyr
,data.table
,重塑
等等。如果有这样一种简单的方法可以用base来做的话R@DavidArenburg,按比例加速,真的。我是重塑
的老铁杆粉丝,但如果有人处理远程大数据,这不是我的第一个建议。重塑()
很简单吗?我要说的是“巴哈哈哈哈”@hadley,我不能代表David说话,但我并没有将他的评论理解为restrape()
很简单,而是暗示这里的restrape()
方法实际上相当简单。在这种情况下,tidyr、dplyr、data.table、restrape2等的整个“混乱”点,它们能更好地概括新问题,而重塑()则不然。
library(dplyr)
library(tidyr)
mydf %>%
gather(var, val, transactions:amount) %>%
unite(var2, type, var) %>%
spread(var2, val)
# id expense_amount expense_transactions income_amount income_transactions
# 1 20 95 25 100 20
# 2 30 250 45 300 50
require(data.table) # v1.9.6+
dcast(dt, id ~ type, value.var=names(dt)[3:4])
# id transactions_expense transactions_income amount_expense amount_income
# 1: 20 25 20 95 100
# 2: 30 45 50 250 300