2017-05-14 34 views
-1

我正在嘗試使用dcast函數將數據從long變爲wide。將數據從長格式轉換爲寬格式 - 多個變量

目標是在value.var參數中使用不同的變量,但R不允許我在其中使用多個值。

有沒有其他方法可以修復它?我看過其他類似的問題,但我一直沒有找到類似的例子。

我送的細節

這裏是我當前的數據 數據集 - 世界

+---------+------+--------+--------------+------------+ 
| Country | Year | Growth | Unemployment | Population | 
+---------+------+--------+--------------+------------+ 
| A  | 2015 |  2 |   8.3 |   40 | 
| B  | 2015 |  3 |   9.2 |   32 | 
| C  | 2015 | 2.5 |   9.1 |   30 | 
| D  | 2015 | 1.5 |   6.1 |   27 | 
| A  | 2016 |  4 |   8.1 |   42 | 
| B  | 2016 | 3.5 |   9 |  32.5 | 
| C  | 2016 | 3.7 |   9 |   31 | 
| D  | 2016 | 3.1 |   5.3 |   29 | 
| A  | 2017 | 4.5 |   8.1 |  42.5 | 
| B  | 2017 | 4.4 |   8.4 |   33 | 
| C  | 2017 | 4.3 |   8.5 |   30 | 
| D  | 2017 | 4.2 |   5.2 |   30 | 
+---------+------+--------+--------------+------------+ 

我的目標是今年列傳遞到列的其餘部分(增長,失業和人口) 。我正在使用下面的dcast功能。

data_wide <- dcast(world, country ~ year, 
    value.var=c("Growth","Unemployment","Population")) 

理想的結果

+---------+-------------+-------------------+-----------------+-------------+-------------------+-----------------+ 
| Country | Growth_2015 | Unemployment_2015 | Population_2015 | Growth_2016 | Unemployment_2016 | Population_2016 | 
+---------+-------------+-------------------+-----------------+-------------+-------------------+-----------------+ 
| A  |   2 |    8.3 |    40 |   4 |    8.1 |    42 | 
| B  |   3 |    9.2 |    32 |   3.5 |     9 |   32.5 | 
| C  |   2.5 |    9.1 |    30 |   3.7 |     9 |    31 | 
| D  |   1.5 |    6.1 |    27 |   3.1 |    5.3 |    29 | 
+---------+-------------+-------------------+-----------------+-------------+-------------------+-----------------+ 
+3

請勿張貼僅適用於圖像。同時發佈'dput(X)'的輸出,其中X是您的輸入數據幀(如果該數據幀較大,則爲X的充分削減版本)。沒有人可以嘗試你的數據,而不用手工輸入,而且不能完全確定列的類。 –

+0

我的第一個猜測是嘗試'重塑(世界,方向=「寬」,timevar =「年」,idvar =「國家」)' –

+0

嗨@Juan。您實際上可以編輯您的問題,刪除您的圖像,然後複製粘貼值。另外,正如前面的評論所述,如果你添加了'dput(X)'的結果將會非常有用。這讓任何想要提供有效答案的人都更容易。謝謝! – lrnzcig

回答

0

由OP給出的dcast()語句的工作幾乎完美的與最新版本的data.table包,因爲這些允許多個測量變量與dcast()melt()使用:

library(data.table) # CRAN version 1.10.4 
setDT(world) # coerce to data.table 
data_wide <- dcast(world, Country ~ Year, 
        value.var = c("Growth", "Unemployment", "Population")) 

data_wide 
# Country Growth_2015 Growth_2016 Growth_2017 Unemployment_2015 Unemployment_2016 Unemployment_2017 Population_2015 
#1:  A   2.0   4.0   4.5    8.3    8.1    8.1    40 
#2:  B   3.0   3.5   4.4    9.2    9.0    8.4    32 
#3:  C   2.5   3.7   4.3    9.1    9.0    8.5    30 
#4:  D   1.5   3.1   4.2    6.1    5.3    5.2    27 
# Population_2016 Population_2017 
1:   42.0   42.5 
2:   32.5   33.0 
3:   31.0   30.0 
4:   29.0   30.0 

這是結果爲相同tidyr solution


然而,OP已要求一個特定的列順序爲他理想的解決方案其中每年的不同測量變量組合在一起。

如果列的正確順序很重要,有兩種方法可以實現這一點。第一種方法是重新排序適當地使用setcolorder()的列:

new_ord <- CJ(world$Year, c("Growth","Unemployment","Population"), 
       sorted = FALSE, unique = TRUE)[, paste(V2, V1, sep = "_")] 
setcolorder(data_wide, c("Country", new_ord)) 

data_wide 
# Country Growth_2015 Unemployment_2015 Population_2015 Growth_2016 Unemployment_2016 Population_2016 Growth_2017 
#1:  A   2.0    8.3    40   4.0    8.1   42.0   4.5 
#2:  B   3.0    9.2    32   3.5    9.0   32.5   4.4 
#3:  C   2.5    9.1    30   3.7    9.0   31.0   4.3 
#4:  D   1.5    6.1    27   3.1    5.3   29.0   4.2 
# Unemployment_2017 Population_2017 
#1:    8.1   42.5 
#2:    8.4   33.0 
#3:    8.5   30.0 
#4:    5.2   30.0 

注意的交叉聯接功能CJ()被用於創建矢量的叉積。


另一種方法來達到所需的列順序是熔化重鑄

molten <- melt(world, id.vars = c("Country", "Year")) 
dcast(molten, Country ~ Year + variable) 
# Country 2015_Growth 2015_Unemployment 2015_Population 2016_Growth 2016_Unemployment 2016_Population 2017_Growth 
#1:  A   2.0    8.3    40   4.0    8.1   42.0   4.5 
#2:  B   3.0    9.2    32   3.5    9.0   32.5   4.4 
#3:  C   2.5    9.1    30   3.7    9.0   31.0   4.3 
#4:  D   1.5    6.1    27   3.1    5.3   29.0   4.2 
# 2017_Unemployment 2017_Population 
#1:    8.1   42.5 
#2:    8.4   33.0 
#3:    8.5   30.0 
#4:    5.2   30.0 
+0

非常感謝你@Uwe座,我真的很感激它。我試過不同的方法,它似乎工作正常。我只在第一個公式中包含了setDT,並填充了右表。 'data_wide < - dcast(setDT(world),Country〜Year, value.var = c(「Growth」,「Unemployment」,「Population」))''。熔化的例子工作得很好。 – Juanma

+0

不用擔心。這真的很有用。如果我還有其他問題,我會回覆你。非常感謝。 – Juanma

0

如果你不嫁給一個dcast的解決方案,我個人覺得tidyr容易。

library(tidyr) 
df <- df %>% 
    gather(key, value, -Country, -Year) %>% 
    unite(new.col, c(key, Year)) %>% 
    spread(new.col, value) 

結果

Country Growth_2015 Growth_2016 Growth_2017 Population_2015 Population_2016 Population_2017 Unemployment_2015 Unemployment_2016 Unemployment_2017 
1  A   2.0   4.0   4.5    40   42.0   42.5    8.3    8.1    8.1 
2  B   3.0   3.5   4.4    32   32.5   33.0    9.2    9.0    8.4 
3  C   2.5   3.7   4.3    30   31.0   30.0    9.1    9.0    8.5 
4  D   1.5   3.1   4.2    27   29.0   30.0    6.1    5.3    5.2 

該作品以

堆疊的所有值成一列...

變量名和年份列組合到單個列...

新的列然後傳播到寬格式

+0

請顯示結果,謝謝。 – Uwe

+0

感謝您的回覆。我剛剛運行代碼,並得到以下錯誤:錯誤:is.character(x)不是TRUE。現在看看它。 – Juanma

+0

嗯,對不起@Juan,對於我來說,這似乎對您提供的數據有效。你會得到這個子集的錯誤嗎?如果你只在整個數據集上運行「收集」線,那怎麼辦? – user127649

相關問題