亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

一次重塑多個值

一次重塑多個值

交互式愛情 2019-09-24 16:47:21
我有一個很長的數據集,我想擴大范圍,我很好奇是否有一種方法可以使用R中的reshape2或tidyr包一步完成所有這些工作。數據框df如下所示:id  type    transactions    amount20  income       20          10020  expense      25          9530  income       50          30030  expense      45          250我想得到這個:id  income_transactions expense_transactions    income_amount   expense_amount20       20                           25                 100             9530       50                           45                 300             250我知道我可以通過例如reshape2來實現這一目標:dcast(df, id ~  type, value.var="transactions")但是,是否有一種方法可以一次處理“交易”和“金額”變量,從而一次重塑整個df?理想情況下,使用新的更合適的列名?
查看完整描述

2 回答

?
開心每一天1111

TA貢獻1836條經驗 獲得超13個贊

在“ reshape2”中,您可以使用recast(盡管根據我的經驗,這不是眾所周知的功能)。


library(reshape2)

recast(mydf, id ~ variable + type, id.var = c("id", "type"))

#   id transactions_expense transactions_income amount_expense amount_income

# 1 20                   25                  20             95           100

# 2 30                   45                  50            250           300

您還可以使用基數R reshape:


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”):


library(data.table)

library(reshape2)

dcast.data.table(melt(as.data.table(mydf), id.vars = c("id", "type")), 

                 id ~ variable + type, value.var = "value")

#    id transactions_expense transactions_income amount_expense amount_income

# 1: 20                   25                  20             95           100

# 2: 30                   45                  50            250           300

在dcast.data.table“ data.table”(1.9.8)的更高版本中,您將可以直接執行此操作。如果我正確理解的話,@ Arun嘗試實現的內容將是在無需首先melt獲取數據的情況下進行重塑,這就是當前發生的情況recast,本質上是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


查看完整回答
反對 回復 2019-09-24
?
慕標琳琳

TA貢獻1830條經驗 獲得超9個贊

使用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


查看完整回答
反對 回復 2019-09-24
  • 2 回答
  • 0 關注
  • 585 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號