2017-02-22 102 views
1

我有一個數據幀,其中一列是矩陣,而不是一個向量,我想將其分割爲多個向量值列。在R中,將數據幀中的向量值列拆分爲多列

例如,這

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) 

給我

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

這是2×2數據幀與所述第二列是一個2×3矩陣:

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

我想將該矩陣分成三列向量。

我能做

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的使用量和結果不強制爲矩陣。但在第二個參數上使用[[確保我們綁定到第二列中的2x3矩陣,而不是包含該矩陣的數據幀。

更一般地說,tidyr::unnestvectorlist列配合良好,但結果很長 - 您必須添加一個列ID並將其傳回以使其恢復爲寬格式。

然而,最簡單的方法可能是使用dplyrsummarize_at使用自定義.funs說法:

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

是。 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。請注意,y是這裏的row.names,但是您可以輕鬆地將其取出。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 
相關問題