假设我有数据框或数据表。
例如:
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。
答案 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始终放在开头,并将其他元素从最常见到最不常见的顺序排列。
也许有一些更简单的方法来总结信息。