Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 一次重塑多个值_R_Dataframe_Reshape_Reshape2_Tidyr - Fatal编程技术网

R 一次重塑多个值

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

我有一个很长的数据集,我想广泛使用,我很好奇是否有一种方法可以使用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  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