簡體   English   中英

將R的“ by”命令的輸出轉換為數據幀

[英]converting output of R's “by” command to data frame

我正在嘗試使用R's by命令來獲取數據幀子集的列均值。 例如,考慮以下數據幀:

> z = data.frame(labels=c("a","a","b","c","c"),data=matrix(1:20,nrow=5))
> z
  labels data.1 data.2 data.3 data.4
1      a      1      6     11     16
2      a      2      7     12     17
3      b      3      8     13     18
4      c      4      9     14     19
5      c      5     10     15     20

我可以使用R's by命令根據標簽列獲取列均值:

> by(z[,2:5],z$labels,colMeans)
z[, 1]: a
data.1 data.2 data.3 data.4
   1.5    6.5   11.5   16.5
------------------------------------------------------------
z[, 1]: b
data.1 data.2 data.3 data.4
     3      8     13     18
------------------------------------------------------------
z[, 1]: c
data.1 data.2 data.3 data.4
   4.5    9.5   14.5   19.5

但是,如何將輸出強制返回到數據幀? as.data.frame不起作用...

> as.data.frame(by(z[,2:5],z$labels,colMeans))
Error in as.data.frame.default(by(z[, 2:5], z$labels, colMeans)) :
  cannot coerce class '"by"' into a data.frame

您可以從plyr包中使用ddply

library(plyr)
ddply(z, .(labels), numcolwise(mean))
  labels data.1 data.2 data.3 data.4
1      a    1.5    6.5   11.5   16.5
2      b    3.0    8.0   13.0   18.0
3      c    4.5    9.5   14.5   19.5

aggregate stats

aggregate(z[,-1], by=list(z$labels), mean)
  Group.1 data.1 data.2 data.3 data.4
1       a    1.5    6.5   11.5   16.5
2       b    3.0    8.0   13.0   18.0
3       c    4.5    9.5   14.5   19.5

dcastreshape2

library(reshape2)
dcast( melt(z), labels ~ variable, mean)

使用sapply

 t(sapply(split(z[,-1], z$labels), colMeans))
  data.1 data.2 data.3 data.4
a    1.5    6.5   11.5   16.5
b    3.0    8.0   13.0   18.0
c    4.5    9.5   14.5   19.5

by的輸出是一個list因此您可以使用do.call rbind它們,然后將其轉換為:

as.data.frame(do.call("rbind",by(z[,2:5],z$labels,colMeans)))
  data.1 data.2 data.3 data.4
a    1.5    6.5   11.5   16.5
b    3.0    8.0   13.0   18.0
c    4.5    9.5   14.5   19.5

處理by輸出可能真的很煩。 我只是找到了一種以數據框格式提取所需內容的方法,並且不需要額外的程序包。

因此,如果您這樣做:

aux <- by(z[,2:5],z$labels,colMeans)

然后,您可以通過執行以下操作將其轉換為數據幀:

  aux_df <- as.data.frame(t(aux[seq(nrow(aux)),seq(ncol(aux))]))

我只是從aux獲取所有行和列,對其進行轉置並使用as.data.frame。

希望對您有所幫助。

暫無
暫無

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

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