2016-06-04 2 views
1

Мне нужно получить сумму col для всех столбцов и получить результат в кадре данных с именами кодов и их суммой в виде двух столбцов. Но если я это сделаю, имя столбца, похоже, станет индексом, а не сам col.Как преобразовать результаты colSums в R в кадр данных

demo=data.frame(a=runif(10),b=runif(10,max=2),c=runif(10,max=3)) 
as.data.frame(colSums(demo)) 

Нежелательный результат:

colSums(demo) 
a  4.083571 
b  11.698794 
c  14.082574 

Желаемый результат:

colname colSums(demo) 
a  4.083571 
b  11.698794 
c  14.082574 

Как я могу добавить заголовок колонки на левом время держать форму, как это? Благодарю.

ответ

2
> demo = data.frame(a=runif(10),b=runif(10,max=2),c=runif(10,max=3)) 
> df <- data.frame(colname = names(demo),colSums_demo=colSums(demo)) 
> print(df, row.names=F) 
    colname colSums_demo 
     a  4.754546 
     b 12.488904 
     c 18.152095 
2

Попробуйте это:

as.data.frame(lapply(demo, sum)) 

Результат:

  a  b  c 
1 6.400121 10.16047 10.6528 
3

Одна из возможностей состоит в переносе результата с t()

data.frame(t(colSums(demo))) 
    a  b  c 
colSums.demo. 5.782475 10.46739 18.46751 

Чтобы изменить имя строки в выводе, мы можем использовать rownames, например, так:

`rownames<-`(data.frame(t(colSums(demo))), "myColsum") 
   a  b  c 
myColsum 5.782475 10.46739 18.46751 
3

Ваш желаемый результат может быть достигнут с stack() и setNames():

setNames(nm=c('colname','colSums(demo)'),stack(colSums(demo))[2:1]); 
## colname colSums(demo) 
## 1  a  4.083571 
## 2  b  11.698794 
## 3  c  14.082574 
+0

+1 Nice оберткой из setNames и стек, и я думаю, что стоит объяснить использование [2: 1] нотации, поскольку это не охватывается в помощи() либо из setNames, или стек (где я думаю, что он работает), который, если отсутствует, отменяет презентацию, то есть colSums (demo) предшествует colname. – Chris

1

Мы можем использовать data.table с melt

library(data.table) 
melt(setDT(demo)[, lapply(.SD, sum)]) 
Смежные вопросы