簡體   English   中英

如何將data.frame的行轉換為列?

[英]How do I turn the rows of my data.frame into columns?

我有一系列特定於變量的data.frames,如下所示:

變數1:

LOCATION 2014.01  2014.02  2014.03  2014.04
902010   7        -3       14       5

變量2:

LOCATION 2014.01  2014.02  2014.03  2014.04
902010   9        11       6        3

我想將轉換轉換為以下格式。

LOCATION    DATE     VARIABLE1  VARIABLE2
902010      2014.01  7          9
902010      2014.02  -3         11
902010      2014.03  14         6
902010      2014.04  5          3

我認為正確的方法是轉換一個data.frame,然后從日期和位置匹配的其他數據中添加數據。

聽起來相似的問題的答案建議使用庫reshape2或函數t(),但我很難理解如何在這種情況下使用它們。 我還看到了有關時間序列動物園的建議。

你應該:

  1. 使用melt以長格式重塑數據
  2. 使用merge通過(LOCATION和日期)組合data.frames

這里是一個完整的解決方案:library(reshape2)

dat1 <- 'LOCATION 2014.01  2014.02  2014.03  2014.04
902010   7        -3       14       5'

dat2 <- 'LOCATION 2014.01  2014.02  2014.03  2014.04
902010   9        11       6        3'

ll <- lapply(list(dat1,dat2),function(x){
dat <- read.table(text=x,header=TRUE)
melt(dat,id.vars ='LOCATION')
})

res <- merge(ll[[1]],ll[[2]],by=1:2)

# LOCATION variable value.x value.y
# 1   902010 X2014.01       7       9
# 2   902010 X2014.02      -3      11
# 3   902010 X2014.03      14       6
# 4   902010 X2014.04       5       3

額外的步驟是將變量列強制為有效日期。

res$variable <- 
as.Date(paste0(sub('X','',res$variable),'.01'),
        format='%Y.%m.%d')

1)定義一個merge函數, merge12其中由前兩個變量和一個合並melt功能, melt1 ,它使用第一可變作為id。 然后定義L ,一個數據幀列表,然后像這樣運行Reduce

library(reshape2)

merge12 <- function(..., by = 1:2) merge(..., by = by)
melt1 <- function(..., id = 1) melt(..., id = id)

L <- list(DF1, DF2)
Reduce(merge12, lapply(L, melt1))

對於問題中的數據幀,這給出了以下內容

  LOCATION variable value.x value.y
1   902010  2014.01       7       9
2   902010  2014.02      -3      11
3   902010  2014.03      14       6
4   902010  2014.04       5       3

注意:這也適用於兩個以上的數據幀。 只需將它們全部放入列表L

2)fn $使用gsubfn中的fn$可以將函數參數表示為公式,我們可以用更緊湊的方式編寫上面的代碼:

library(reshape2)
library(gsubfn)

L <- list(DF1, DF2)
fn$Reduce(~ merge(..., by = 1:2), fn$lapply(L, ~ melt(..., id = 1)))

給出相同的結果。

加了 (2)

您是否嘗試過merge()函數?

您可能還會發現它有用! 按行名稱合並或合並

這是使用基本R函數到達那里的一種方法。

> cb <- cbind(var1[1], names(var1)[-1], sapply(list(var1[-1], var2[-1]), t))
> names(cb)[2:4] <- c("DATE", "VAR1", "VAR2") 
> cb
#   LOCATION     DATE VAR1 VAR2
# 1   902010 X2014.01    7    9
# 2   902010 X2014.02   -3   11
# 3   902010 X2014.03   14    6
# 4   902010 X2014.04    5    3

而且,如果您不介意各列的順序不同,則可以將其縮短為三列,

> rb <- rbind(var1 = var1, var2 = var2)
> cbind(t(rb[-1]), LOC = var1$LOCATION)
#          var1 var2    LOC
# X2014.01    7    9 902010
# X2014.02   -3   11 902010
# X2014.03   14    6 902010
# X2014.04    5    3 902010

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM