【发布时间】:2017-04-22 23:56:32
【问题描述】:
假设我有一个数据框或数据表。
例如:
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 填充。
【问题讨论】:
-
那么多列的输出到底是什么样的呢?您正在尝试创建一个每列一行的纯文本文件?
-
lapply(try, function(x) table(x, useNA="ifany"))可能更接近你想要的。然后决定如何制作数据表格或将每个列表元素写入单独的工作表。 -
我同意不清楚你想要什么,但我会考虑
melt(try)[, .N, by=.(variable, value)] -
长格式结果很好,但它不适合我已经存在的描述变量的 Excel 表,每行包含单个变量的信息,我想在右边添加这个结果现有的。列表也有同样的问题。我已经更新了我的问题。
-
我试图给出一个答案,但它并不完全好。
标签: r data.table summary