[英]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(),但我很難理解如何在這種情況下使用它們。 我還看到了有關時間序列動物園的建議。
你應該:
melt
以長格式重塑數據 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.