【问题标题】:Generate a table of values for several columns为多列生成一个值表
【发布时间】: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


【解决方案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})
]

它总是将 NA 放在开头,并按从最常见到最不常见的顺序排列其他元素。

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

【讨论】:

  • 是您的最后一句话,您可能正在导出到 Excel,因为您更喜欢在那里进行分析...我认为在导出后执行该步骤更有意义。
  • 我在 R 中使用 data.table 进行分析,因为我的数据非常大,是一个 3GB 的 csv 文件。我只是使用 Excel 导出结果、各种摘要并使用它们进行进一步操作,例如选择满足某些条件的原始 csv 列。
  • 如何强制它首先显示该列表中的 NA 数量?
  • 我认为你不能没有扭曲。虽然 NA 可以是一个因子水平,但它总是出现在最后。 stackoverflow.com/q/27195956
【解决方案2】:

你可以得到你想要的输出

library(magrittr)
tab = try %>% lapply(table, useNA = "ifany")
len = max(lengths(tab))

tab %>% lapply(
    . %>% 
    { paste0(names(.), ":", .) } %>% 
    `length<-`(len)
) %>% setDF %>% print


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

我没有学过 purrr,但如果你喜欢使用管道,那可能会提供更简洁的代码。

【讨论】:

  • 我不太了解 OP 下的最新 cmets,所以我想我会发布答案...
猜你喜欢
  • 2016-12-03
  • 1970-01-01
  • 2016-04-28
  • 1970-01-01
  • 2017-07-01
  • 2022-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多