簡體   English   中英

使用列名稱中的時間值重塑R中的數據

[英]Reshaping data in R with time values in column names

我有一個看起來像這樣的數據框(簡化):

     data1.time1 data1.time2 data2.time1 data2.time2 data3.time1 group
 1          1.53        2.01        6.49        5.22        3.46    A
 ...
 24         2.12        3.14        4.96        4.89        3.81    C

這里居然有dataK.timeT為K的1..27和T的1..8一些(但也許不是全部)。

我想將數據重新排列為K個數據幀,以便可以為每個K繪制A,B和C三個組中每個組的摘要數據(現在讓我們說均值和均值±標准差)。是的,我想要27個圖形,每個圖形有3條線,並標記偏差。

重新排列數據后,應該很容易按組折疊,計算摘要統計信息等。但是我不太確定如何將數據轉換為這種形式。 我查看了reshape軟件包,該軟件包建議將其融合為鍵值存儲格式並從那里重新排列,但是它似乎並不像我在這里那樣支持包含T值的列。

有什么好方法嗎? 我非常願意使用R以外的方法來執行此操作,因為我可以在轉換后將結果導入R中。

在創建具有與您相似的結構的偽數據后,我們從寬格式轉換為長格式,從而制作了一個“整潔”的數據框,可以使用ggplot2進行繪制。

library(reshape2)
library(ggplot2)
library(dplyr)

創建虛假數據

set.seed(194)
dat = data.frame(replicate(27*8, cumsum(rnorm(24*3))))

names(dat) = paste0(rep(paste0("data",1:27), each=8), ".", rep(paste0("time",1:8), 27))

dat$group = rep(LETTERS[1:3], each=24)

刪除一些列,以使不同數據源的時間點數不同:

dat = dat[ , -c(2,4,9,43,56,78,100:103,115:116,134:136,202,205)]

從寬幅改到長幅

datl = melt(dat, id.var="group")

將數據源和時間點分為不同的列:

datl$source = gsub("(.*)\\..*","\\1", datl$variable)
datl$time = as.numeric(gsub(".*time(.*)","\\1", datl$variable))

# Order data frame names by number (rather than alphabetically)
datl$source = factor(datl$source, levels=paste0("data",1:length(unique(datl$source))))

使用ggplot2繪制數據

# Helper function for plotting standard deviation
sdFnc = function(x) {
  vals = c(mean(x) - sd(x), mean(x) + sd(x))
  names(vals) = c("ymin", "ymax")
  vals
}

pd = position_dodge(0.7)

ggplot(datl, aes(time, value, group=group, color=group)) + 
  stat_summary(fun.y=mean, geom="line", position=pd) +
  stat_summary(fun.data=sdFnc, geom="errorbar", width=0.4, position=pd) +
  stat_summary(fun.y=mean, geom="point", position=pd) +
  facet_wrap(~source, ncol=3) +
  theme_bw()

在此處輸入圖片說明

原始(不必要復雜)重塑代碼。 (請注意,此代碼將不再與更新的(偽)數據集一起使用,因為時間列的數量不再統一):

# Convert data source from wide to long
datl = data.frame()
for (i in seq(1,27*8,8)) {

  tmp.dat = dat[, c(i:(i+7),grep("group",names(dat)))]
  tmp.dat$source = gsub("(.*)\\..*", "\\1", names(tmp.dat)[1])
  names(tmp.dat)[1:8] = 1:8

  #datl = rbind(datl, tmp.dat)
  datl = bind_rows(datl, tmp.dat)  # Updated based on comment
}

datl$source = factor(datl$source, levels=paste0("data",1:27))

# Convert time from wide to long
datl = melt(datl, id.var = c("source","group"), variable.name="time")

可以使用dplyr執行以下操作:

for(i in 1:K){ ## for 1:27
  my.data.ind <- paste0("data",i,"|group") ## "datai|group"
  one.month <- select(data, contains(my.data.ind) %>% ## grab cols that have these
                  group_by(group) %>% ## group by your group
                  summarise_each(funs(mean), funs(sd)) ## find mean for each col within each group
}

那應該留下一個3xT數據幀,該數據幀具有時間T上每個組的平均值

暫無
暫無

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

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