更好的 data.frame 长列名格式
better data.frame formatting for long column names
设置
我有一个 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.table
进行渲染,这很有帮助,但如果我可以垂直旋转列名就更好了:
> 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
有什么办法吗?
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
}
您的问题有多种可能的解决方案。对于您在问题中提出的每个建议,我都列出了一种完成该想法的方法。我个人认为移调解决方案 (#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
设置
我有一个 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.table
进行渲染,这很有帮助,但如果我可以垂直旋转列名就更好了:
> 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
有什么办法吗?
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
}
您的问题有多种可能的解决方案。对于您在问题中提出的每个建议,我都列出了一种完成该想法的方法。我个人认为移调解决方案 (#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