生成多列

时间:2016-12-07 21:25:25

标签: r data.table summary

假设我有数据框或数据表。

例如:

try <- data.frame(AA=c(1,2,3,1,2,3,4,5,NA),BB=c(1,2,2,NA,
2,1,2,2,NA), CC=c("A","B", NA, NA, "A","B", "A","C","B"))
setDT(try)

 AA BB CC
 1  1   A
 2  2   B
 3  2   NA
 1 NA   NA
 2  2   A
 3  1   B
 4  2   A
 5  2   C
 NA NA  B

我想总结这些值,以便将它们导出到Excel文件中,以便以后进一步操作。

我可以为每一列创建一个表,但在现实生活中,某些变量可能有太多不同的值(例如人的权重或DOB)。

我可以通过以下方式获得单个列的前六个值:

table(try$BB,  useNA ="ifany") 

1    2 <NA> 
2    5    2 

但是,当我尝试自动为所有列自动执行此操作时,它不会按预期工作:

try[,lapply(.SD,function(x) table(x,useNA="ifany")[1:6] )]

因为table()命令生成一个2行结果,只有一个用于创建最终的汇总表。

您建议采用哪种程序来保存这些信息?

例如,我可以尝试将单变量表转换为类似

的表
"1":2    "2":5 "NA":2

但我不知道该怎么做。也许将其转化为因素,可能会粘贴价值观。 我甚至无法提取表格的行以进行进一步操作。 任何带有基本data.frame或date.table的解决方案都是受欢迎的。

或者我甚至可以命令该表首先获得最常见的值。

PD:我想要这样的事情:

AA  "1":2   "2":2   "3":2   "4":1   "5":1   "NA": 1
BB  "1":2   "2":5   "NA": 2         
CC  "A":3   "B":3   "C":1   "NA": 2     

PD2: 我试过这个

try[,lapply(.SD, function(x) { tmp <- table(x, 
     useNA ="ifany") ;  mapply(paste0, names( tmp ), 
     rep(":", length(tmp)), tmp )} )
   ]

但它太长了而且效果不好

 AA   BB   CC
1:2  1:2  A:3
2:2  2:5  B:3
3:2 NA:2  C:1
4:1  1:2  NA:2
5:1  1:2  A:3
NA:1  2:5  B:3

它用假值填充最后一个值。

另一种选择是交织名称和值。

在这个例子中,我应该得到:

  AA   BB   CC
 "1:2"  "1:2"  "A:3"
 "2:2"  "2:5"  "B:3"
 "3:2"  "NA:2" "C:1"
 "4:1"    NA   "NA:2"
 "5:1"    NA    NA
 "NA:1"   NA    NA

问题是列表通过命令as.data.table.list()在内部转换为数据表,并且不同的大小向量被回收而不是填充NA。

1 个答案:

答案 0 :(得分:1)

这是我的data.table解决方案,其中包含了Frank的一些想法。

siz <- 6
try[,lapply(.SD, function(x) { tmp <- table(x, 
useNA ="ifany") ;  tmp2 <- c(tmp[is.na(names(tmp))],
rev(sort(tmp[!is.na(names(tmp))]))); 
tmp3 <- mapply(paste0, names( tmp2 ),rep(":",
length(tmp2)),tmp2); length(tmp3)<-siz; tmp3})
]

它将NAs始终放在开头,并将其他元素从最常见到最不常见的顺序排列。

也许有一些更简单的方法来总结信息。