1

设置

data.frame充满了一些垃圾:

> set.seed(12345)
> d <- data.frame(x=rnorm(100), y=rnorm(100), z=rnorm(100)) %>% tbl_df
> d %>% head(3)
Source: local data frame [6 x 3]

           x          y          z
1  0.5855288  0.2239254 -1.4361457
2  0.7094660 -1.1562233 -0.6292596
3 -0.1093033  0.4224185  0.2435218

现在我想看看我的变量之间的一些关系:

> '%cor%' <- function(x,y) round(100 * cor(x,y, use='pairwise'), 1)
> d %>% summarize(x %cor% y, y %cor% z, lag(x) %cor% z)
Source: local data frame [1 x 3]

  x %cor% y y %cor% z lag(x) %cor% z
1      10.4     -12.7            7.8

问题

我的列的名称大于数据本身。

糟糕的解决方案 #1:手动命名

我可以做的一件事是自己命名列,但这需要额外的簿记,所以它很快就会变得烦人:

 > d %>% summarize(x2y=x %cor% y, y2z=y %cor% z, Lx2y=lag(x) %cor% z)
 Source: local data frame [1 x 3]

    x2y   y2z Lx2y
 1 10.4 -12.7  7.8

糟糕的解决方案#2:转置

我可以做的另一件事是转置:

 > d %>% summarize(x %cor% y, y %cor% z, lag(x) %cor% z) %>% t
                 [,1]
 x %cor% y       10.4
 y %cor% z      -12.7
 lag(x) %cor% z   7.8

问题是当我开始分组时,它会向下转换列:

 > d %>% mutate(group=cut(z, c(-Inf,0,Inf))) %>% 
         group_by(group) %>% 
         summarize(x %cor% y, y %cor% z, lag(x) %cor% z) %>% t
                [,1]       [,2]      
 group          "(-Inf,0]" "(0, Inf]"
 x %cor% y      " 6.9"     "14.9"    
 y %cor% z      "-19.8"    "-17.3"   
 lag(x) %cor% z " 3.9"     "-6.3"

有没有办法告诉print.data.frame(...)我希望它水平而不是垂直显示系列?

糟糕的解决方案#3:grid.table

我尝试过的另一件事是使用gridExtra::grid.tablewhich 进行渲染,但如果我可以垂直旋转列名会很好:

> gt <- function(df) { 
          grid.newpage()
          df %>% grid.table(core.just='right', show.rownames=F)
        }
> d %>% summarize(x %cor% y, y %cor% z, lag(x) %cor% z) %>% gt

在此处输入图像描述

有没有办法做到这一点?

4

2 回答 2

1

您的问题有几种可能的解决方案。对于您在问题中提出的每个建议,我都列出了一种完成该想法的方法。我个人认为转置解决方案(#2)是最好的解决方案。

解决方案#1:手动命名

代替真正的手动名称,您可以在函数中编码您喜欢的名称(例如naming_convention)。然后你调用这个函数来重命名整个data.frame.

# use this function to define all naming you would like to use
naming_convention <- function(data){
  colnames(data) <- gsub(' %cor% ', '2', colnames(data)) # rename %cor% with 2
  colnames(data) <- gsub('lag', 'L', colnames(data))     # rename lag with L
  colnames(data) <- gsub(' |[(]|)', '', colnames(data))  # remove () 
  return(data)
}
# call function
d %>% summarize(x %cor% y, y %cor% z, lag(x) %cor% z) %>%
  naming_convention
## Source: local data frame [1 x 3]
## 
##    x2y   y2z Lx2z
## 1 10.4 -12.7  7.8

解决方案#2:转置

matrix背面转换data.frame为正确打印。

d %>% mutate(group=cut(z, c(-Inf,0,Inf))) %>% 
  group_by(group) %>% 
  summarize(x %cor% y, y %cor% z, lag(x) %cor% z)%>% 
  t %>% 
  data.frame
##                      X1       X2
## group          (-Inf,0] (0, Inf]
## x %cor% y           6.9     14.9
## y %cor% z         -19.8    -17.3
## lag(x) %cor% z      3.9     -6.3

解决方案#3:grid.table

这可能不是一个好主意,但您可以将前两种策略与调用一起使用grid.table

# manual rename
gt1 <- function(df) { 
  grid.newpage()
  nm <- gsub(' %cor% ', '2', colnames(df)) # rename %cor% with 2
  nm <- gsub('lag', 'L', nm)     # rename lag with L
  nm <- gsub(' |[(]|)', '', nm)  # remove () 
  df %>% grid.table(core.just='right', theme=list(cols=nm))
}
d %>% mutate(group=cut(z, c(-Inf,0,Inf))) %>% 
  group_by(group) %>% 
  summarize(x %cor% y, y %cor% z, lag(x) %cor% z)%>% 
  gt1
# transpose
gt2 <- function(df) { 
  grid.newpage()
  df %>% t %>% grid.table(core.just='right')
}
d %>% mutate(group=cut(z, c(-Inf,0,Inf))) %>% 
  group_by(group) %>% 
  summarize(x %cor% y, y %cor% z, lag(x) %cor% z)%>% 
  gt2
于 2015-01-27T16:25:53.993 回答
0
summarized.correlation = function(d) {
    correlations = cor(d) * 100
    s.correlations = correlations[upper.tri(correlations)]

    namez = apply(combn(colnames(correlations), 2), 2, function(pairs) { do.call(function(...) { paste(..., sep="2")}, as.list(pairs)) })
    names(s.correlations) = namez
    s.correlations
}
于 2015-01-26T18:36:20.377 回答