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 
相关问题