2017-02-22 15 views
1

データフレームは、ベクトルではなく行列です。私がしたいRでは、データフレームのベクトル値の列を複数の列に分割します。

> dim(results) 
[1] 2 2 
> results[,2] 
      [,1]  [,2]  [,3] 
[1,] 0.4710224 0.4280053 0.3206661 
[2,] 0.5769064 0.6220120 0.2683387 

:たとえば、この

set.seed(101) 
Df <- data.frame(x = runif(100), 
       y = round(runif(100))) 

descriptives <- function(arg) c(mean(arg), median(arg), sd(arg)) 
results <- aggregate(x ~ y, data=Df, descriptives) 

は私に2番目の列は2×3行列であることと、2×2のデータフレームである

> results 
    y  x.1  x.2  x.3 
1 0 0.4710224 0.4280053 0.3206661 
2 1 0.5769064 0.6220120 0.2683387 

を与える

その行列を3つの列ベクトルに分割します。

私は

results <- cbind(results$y, as.data.frame(results[,2])) 
names(results) <- c('y', 'mean', 'median', 'sd') 

> results 
    y  mean median  sd 
1 0 0.4710224 0.4280053 0.3206661 
2 1 0.5769064 0.6220120 0.2683387 

を行うことができます。しかし、より直接的かつ少ないハック方法はありますか?私はtidyrseparateのようなものを考えていますか?この場合

+0

'as.data.frame(マトリックス(非公開に(結果)、nrow = nrow(結果)))'のようなもの? – Sotos

答えて

1

は、マトリックスと、あなたはcbindを使用することができます:最初の引数に[を使用して

cbind(results[1], results[[2]]) 
# y   1   2   3 
# 1 0 0.4710224 0.4280053 0.3206661 
# 2 1 0.5769064 0.6220120 0.2683387 

は、それがdata.frameで確認しますので、cbind.data.frameが使用され、その結果が行列に強制されていません。しかし、[[を2番目の引数に使用すると、その行列を含むデータフレームではなく、2番目の列の2x3行列にバインドされていることが確認されます。

は、より一般的には、tidyr::unnestvectorまたはlist列でうまく動作しますが、結果は長い形をしている - あなたは、列IDを追加し、バック広いフォームにそれを得るためにそれを広めなければならないでしょう。

library(dplyr) 
descrip = funs(m = mean, med = median, sd = sd) 
Df %>% group_by(y) %>% summarize_at("x", .funs = descrip) 
# # A tibble: 2 × 4 
#  y   m  med  sd 
# <dbl>  <dbl>  <dbl>  <dbl> 
# 1  0 0.4710224 0.4280053 0.3206661 
# 2  1 0.5769064 0.6220120 0.2683387 
1

はい:

しかし、最も簡単な方法は、カスタム.funs引数でdplyrsummarize_atを使用することであってもよいです。 dplyrで比較的簡単です。

library(dplyr) 
results <- Df %>% group_by(y) %>% 
     summarize(mean = mean(x), 
        median = median(x), 
        sd = sd(x)) 
1

つの基地Rの代替は、使用にaggregatetapplyの内部関数であり、各統計的計算により実行するlapplyを使用:ここ

# collect desired statistical calculations in a named list 
descriptives <- list(mean=mean, median=median, sd=sd) 

# get data.frame of values 
dfStats <- data.frame(lapply(descriptives, function(f) tapply(Df$x, Df$y, f))) 
dfStats 
     mean median  sd 
0 0.4710224 0.4280053 0.3206661 
1 0.5769064 0.6220120 0.2683387 

、機能のリストをlapply実行し、適用されグループ計算を得るためにtapply。結果のリストはdata.frameのdata.frameに格納されます。 yはここの行。名前ですが、簡単にそれを引き出すことができますrow.names修正

dfStats$y <- row.names(dfStats) 
1

一つのアプローチの問題は、(他の人が指摘しているようしかし、出て、問題がを回避することができます)do.call(data.frame, ...)を使用することです。

例:多分

do.call(data.frame, results) 
# y  x.1  x.2  x.3 
# 1 0 0.4710224 0.4280053 0.3206661 
# 2 1 0.5769064 0.6220120 0.2683387 
str(.Last.value) 
# 'data.frame': 2 obs. of 4 variables: 
# $ y : num 0 1 
# $ x.1: num 0.471 0.577 
# $ x.2: num 0.428 0.622 
# $ x.3: num 0.321 0.268 
関連する問題