2015-12-07 2 views
0

Comment stocker quelques nombres dans un élément de la trame de données? Par exemple, je veux un résumé de mes données, y compris la classe et les valeurs dans chaque colonne.comment gérer le vecteur comme élément dans le cadre de données? [R]

dat = data.frame(STATE = 1:5, 
       MONTH = 1:5) 

devrait céder:

var  class values 
STATE numeric c(1,2,3,4,5) 
MONTH numeric c(1,2,3,4,5) 

Maintenant, j'essaie:

dat = data.frame(STATE = 1:5, 
       MONTH = 1:5) 

vars = data.frame(var = colnames(dat), class = NA, values = NA, 
        stringsAsFactors = F) 
vars$class = sapply(dat, class) 

vars 
#  var class values 
# 1 STATE integer  NA 
# 2 MONTH integer  NA 

vars$values = sapply(dat, function(x) unique(x)) 
# Error in `$<-.data.frame`(`*tmp*`, "values", value = c(1L, 2L, 3L, 4L, : 
#    replacement has 5 rows, data has 2 

# UPDATE: @jMathew 's answer: 
vars$values = sapply(dat, function(x) list(unique(x))) 
vars 
# var class  values 
# 1 STATE integer 1, 2, 3, 4, 5 
# 2 MONTH integer 1, 2, 3, 4, 5 

Il ne fonctionne pas parce que = uniques (dat ETAT $) c (1,2,3,4 , 5), et R pense qu'il devrait y avoir 5 éléments dans le cadre de données, et ne peut pas tenir dans un élément.

Mais le code ci-dessus fonctionne pour de nombreux ensembles de données avec lesquelles je travaille, par exemple .:

library(foreign) 
dat = read.xport('LLCP2013.XPT') 
# download from http://www.cdc.gov/brfss/annual_data/2013/files/LLCP2013XPT.ZIP 

dat = dat[1:5, 1:3] 
dat 
# X_STATE FMONTH IDATE 
# 1  1  1 01092013 
# 2  1  1 01192013 
# 3  1  1 01192013 
# 4  1  1 01112013 
# 5  1  2 02062013 

vars = data.frame(var = colnames(dat), class = NA, values = NA, 
        stringsAsFactors = F) 
vars$class = sapply(dat, class) 
vars$values = sapply(dat, function(x) unique(x)) 
vars 
# var class   values 
# 1 X_STATE numeric    1 
# 2 FMONTH numeric   1, 2 
# 3 IDATE factor 16, 36, 20, 70 

# UPDATE: 
class(vars[3,3]) 
# [1] "list" 
# @jMathew was right, it was somehow coerced to list 

Quelqu'un peut-il me dit pourquoi cela fonctionne dans le second cas, mais pas dans le premier? Merci

Répondre

1

Je soupçonne que, dans votre second cas, le vecteur est contraint à un list Essayez, cela sur votre premier exemple

vars$values = sapply(dat, function(x) list(unique(x))) 
1

Nous pourrions essayer

do.call(rbind,lapply(seq_along(dat), function(i) 
     data.frame(var=names(dat)[i], class=class(dat[,i]), 
     values= sprintf('c(%s)', toString(unique(dat[,i])))))) 
# var class   values 
#1 STATE integer c(1, 2, 3, 4, 5) 
#2 MONTH integer c(1, 2, 3, 4, 5)