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

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

如何將數據從長格式轉換為寬格式

如何將數據從長格式轉換為寬格式

慕婉清6462132 2019-05-20 17:19:08
我無法重新排列以下數據框:set.seed(45)dat1 <- data.frame(    name = rep(c("firstName", "secondName"), each=4),    numbers = rep(1:4, 2),    value = rnorm(8)    )dat1       name  numbers      value1  firstName       1  0.34079972  firstName       2 -0.70334033  firstName       3 -0.37953774  firstName       4 -0.74604745 secondName       1 -0.89810736 secondName       2 -0.33479417 secondName       3 -0.50137828 secondName       4 -0.1745357我想重新整形它,以便每個唯一的“名稱”變量是一個rowname,其中“值”作為沿該行的觀察值,“數字”作為同名。有點像:     name          1          2          3         41  firstName  0.3407997 -0.7033403 -0.3795377 -0.74604745 secondName -0.8981073 -0.3347941 -0.5013782 -0.1745357我看melt,并cast和其他一些東西,但沒有人可以做的工作。
查看完整描述

6 回答

?
汪汪一只貓

TA貢獻1898條經驗 獲得超8個贊

使用reshape功能:

reshape(dat1, idvar = "name", timevar = "numbers", direction = "wide")


查看完整回答
反對 回復 2019-05-20
?
慕萊塢森

TA貢獻1810條經驗 獲得超4個贊

新的(2014年)tidyr包也做到這一點簡單地說,與gather()spread()是的條款meltcast。

library(tidyr)spread(dat1, key = numbers, value = value)

來自github,

tidyr是一個重新reshape2設計,旨在配合整潔的數據框架,并與數據分析建立一個堅實的管道,magrittrdplyr建立一個堅實的管道。

就像reshape2重塑tidyr不到一樣,做得不到reshape2。它專門用于整理數據,而不是一般的重塑reshape2,或重塑的一般聚合。特別是,內置方法僅適用于數據幀,并且不tidyr提供邊距或聚合。


查看完整回答
反對 回復 2019-05-20
?
侃侃爾雅

TA貢獻1801條經驗 獲得超16個贊

您可以使用該reshape()函數或reshape包中的melt()/ cast()functions 執行此操作。對于第二個選項,示例代碼是


library(reshape)

cast(dat1, name ~ numbers)

或使用 reshape2


library(reshape2)

dcast(dat1, name ~ numbers)


查看完整回答
反對 回復 2019-05-20
?
墨色風雨

TA貢獻1853條經驗 獲得超6個贊

如果性能是一個問題的另一個選擇是使用'的融合和dcast函數data.table的擴展reshape2

參考:使用data.tables進行高效重塑

library(data.table)


setDT(dat1)

dcast(dat1, name ~ numbers, value.var = "value")


#          name          1          2         3         4

# 1:  firstName  0.1836433 -0.8356286 1.5952808 0.3295078

# 2: secondName -0.8204684  0.4874291 0.7383247 0.5757814

而且,從data.table v1.9.6開始,我們可以在多列上進行轉換


## add an extra column

dat1[, value2 := value * 2]


## cast multiple value columns

dcast(dat1, name ~ numbers, value.var = c("value", "value2"))


#          name    value_1    value_2   value_3   value_4   value2_1   value2_2 value2_3  value2_4

# 1:  firstName  0.1836433 -0.8356286 1.5952808 0.3295078  0.3672866 -1.6712572 3.190562 0.6590155

# 2: secondName -0.8204684  0.4874291 0.7383247 0.5757814 -1.6409368  0.9748581 1.476649 1.1515627


查看完整回答
反對 回復 2019-05-20
?
慕少森

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

使用您的示例數據框,我們可以:

xtabs(value ~ name + numbers, data = dat1)


查看完整回答
反對 回復 2019-05-20
?
拉莫斯之舞

TA貢獻1820條經驗 獲得超10個贊

其他兩個選擇:


基礎包:


df <- unstack(dat1, form = value ~ numbers)

rownames(df) <- unique(dat1$name)

df

sqldf 包:


library(sqldf)

sqldf('SELECT name,

      MAX(CASE WHEN numbers = 1 THEN value ELSE NULL END) x1, 

      MAX(CASE WHEN numbers = 2 THEN value ELSE NULL END) x2,

      MAX(CASE WHEN numbers = 3 THEN value ELSE NULL END) x3,

      MAX(CASE WHEN numbers = 4 THEN value ELSE NULL END) x4

      FROM dat1

      GROUP BY name')


查看完整回答
反對 回復 2019-05-20
  • 6 回答
  • 0 關注
  • 1216 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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