0

我有一个包含 10k 行和 500 列的数据框。对于每一列,我想为行中的每个唯一值创建一个计数。例如

      Fruit    Vegetable  Meat 
1     Apple    Carrot     Steak
2     Apple    Potato     Chicken
3     Pear     Peas       Duck

会产生:

Fruit;Apple;2;Pear;1
Vegetable;Carrot;1;Potato;1;Peas;1
Meat;Steak;1;Chicken;1;Duck;1

Hmisc describe 函数会产生这种分析,但输出的格式非常糟糕,以至于毫无用处。

谢谢。

4

2 回答 2

0

您可以table通过apply

例如

fruit <- c("Apple", "Apple", "Pear")
veg <- c("Carrot", "Potato", "Peas")
meat <- c("Steak", "Chicken", "Duck")
df <- data.frame(fruit, veg, meat)

apply(df, 2, table)

$fruit

Apple  Pear 
    2     1 

$veg

Carrot   Peas Potato 
     1      1      1 

$meat

Chicken    Duck   Steak 
      1       1       1
于 2013-08-18T15:28:09.370 回答
0
lapply(names(df),function(x){ tb <- table(df[[x]]);
      write.table(file="test.csv", append=TRUE, quote=FALSE, 
                  row.names=FALSE, col.names=FALSE, sep=";", 
                  x= paste(x, paste( names(tb), tb, collapse=";", sep=";") , 
                           sep=";") 
                  )})
#--------
fruit;Apple;2;Pear;1
veg;Carrot;1;Peas;1;Potato;1
meat;Chicken;1;Duck;1;Steak;1

您还将看到不会发送到文本文件的三个 NULL 列表。将表格和矩阵写入文件并不是 R 的强项write.matrix。package::MASS 中有一个函数。我最初的努力writeLines失败了,因为它没有“附加”选项,而且我无法拼凑一个可以执行append.

(R 中的另一个问题是使用 'apply/lapply/sapply' 处理列表(并通过继承数据帧)不会将names列表元素(和colnames数据帧)的 传递给函数,因此“写入”函数内部没有用于写入文件的名称。这就是为什么我使用names(df)而不是仅使用df.

进一步说明,可能有 JSON 编写函数,它们可能更可靠。我会看看并报告回来。

有 RJSONIO 包:

> require(RJSONIO)
Loading required package: RJSONIO
> toJSON(df)
[1] "{\n \"fruit\": [ \"Apple\", \"Apple\", \"Pear\" ],\n\"veg\": [ \"Carrot\", \"Potato\", \"Peas\" ],\n\"meat\": [ \"Steak\", \"Chicken\", \"Duck\" ] \n}"
于 2013-08-18T16:00:17.747 回答