【问题标题】:summarise count of options of variables汇总变量选项的数量
【发布时间】:2020-09-24 19:15:32
【问题描述】:

我有一个包含许多变量及其选项的大数据框,因此我想要计算所有变量及其选项的数量。例如下面的数据框。

我还有另一个相同的数据框,如果我想合并这两个数据框,检查列的名称是否相同,如果不是,则获取不同列名的名称。

不包括 c(uniqueid,name) 列 目的是在 count 的帮助下找出我们是否有任何拼写错误的单词,或者这些单词是否有任何口音。

df11 <- data.frame(uniqueid=c(9143,2357,4339,8927,9149,4285,2683,8217,3702,7857,3255,4262,8501,7111,2681,6970),
                    name=c("xly,mnn","xab,Lan","mhy,mun","vgtu,mmc","ftu,sdh","kull,nnhu","hula,njam","mund,jiha","htfy,ntha","sghu,njui","sgyu,hytb","vdti,kula","mftyu,huta","mhuk,ghul","cday,bhsue","ajtu,nudj"),
                    city=c("A","B","C","C","D","F","S","C","E","S","A","B","W","S","C","A"),
                    age=c(22,45,67,34,43,22,34,43,34,52,37,44,41,40,39,30),
                    country=c("usa","USA","AUSTRALI","AUSTRALIA","uk","UK","SPAIN","SPAIN","CHINA","CHINA","BRAZIL","BRASIL","CHILE","USA","CANADA","UK"),
                    language=c("ENGLISH(US)","ENGLISH(US)","ENGLISH","ENGLISH","ENGLISH(UK)","ENGLISH(UK)","SPANISH","SPANISH","CHINESE","CHINESE","ENGLISH","ENGLISH","ENGLISH","ENGLISH","ENGLISH","ENGLISH(US)"),
                    gender=c("MALE","FEMALE","male","m","f","MALE","FEMALE","f","FEMALE","MALE","MALE","MALE","FEMALE","FEMALE","MALE","MALE"))

输出应该类似于变量组计数及其选项的摘要。它是一种枢轴,例如:对于城市 因此它应该选择数据框中的所有可用列,并为列中可用的所有选项提供一种计数摘要

【问题讨论】:

  • 您的输入数据目前不可重现。也不清楚您的预期输出是什么。
  • 你试过unique()lenght()base::intersect()attributes()str()names()等吗?
  • 我刚刚更新了问题,对 R 来说有点新
  • 你可以看看"tidyverse" options,或者,如果你只是想要快速的结果,你可以试试apply(df11[, 2:ncol(df11)], 2, table)之类的东西
  • 为了更好的显示:apply(df11[, 2:ncol(df11)], 2, function(x) as.data.frame(table(x)))

标签: r


【解决方案1】:

我对你所谓的“选项”感到很困惑,但这里是从仅使用基本 R 函数开始的东西。

注意:它仅指问题的第一部分“我想要所有变量及其选项的计数”。

res <- do.call(rbind, lapply(df11[, 3:ncol(df11)], function(option) as.data.frame(table(option)))) # apply table() to the selected columns and gather the output in a dataframe
res$variable <- gsub("[.](.*)","", rownames(res)) # recover the name of the variable from the row names with a regular expression
rownames(res) <- NULL # just to clean
res <- res[, c(3,1,2)] # ordering columns
res <- res[order(-res$Freq), ] # sorting by decreasing Freq

输出:

> res
   variable      option Freq
34 language     ENGLISH    7
42   gender        MALE    7
39   gender      FEMALE    5
3      city           C    4
1      city           A    3
7      city           S    3
11      age          34    3
36 language ENGLISH(US)    3
2      city           B    2
9       age          22    2
16      age          43    2
27  country       CHINA    2
28  country       SPAIN    2
30  country          UK    2
32  country         USA    2
33 language     CHINESE    2
35 language ENGLISH(UK)    2
37 language     SPANISH    2
38   gender           f    2
4      city           D    1
5      city           E    1
6      city           F    1
8      city           W    1
10      age          30    1
12      age          37    1
13      age          39    1
14      age          40    1
15      age          41    1
17      age          44    1
18      age          45    1
19      age          52    1
20      age          67    1
21  country    AUSTRALI    1
22  country   AUSTRALIA    1
23  country      BRASIL    1
24  country      BRAZIL    1
25  country      CANADA    1
26  country       CHILE    1
29  country          uk    1
31  country         usa    1
40   gender           m    1
41   gender        male    1

【讨论】:

  • 这完全符合我的要求,但是如果我想对 desc 中的所有变量的频率进行排序,那么还有一件事......???
  • 如果我想取消选择列列表,我的意思是忽略这些列。在 df11[, 3:ncol(df11) 中取消选择。可能在 3:ncol(df11) 之间有带有序列号或随机数的列,所以我想通过给出列列表来取消选中这些列
  • @sanuali0123 添加了对数据进行排序的代码。如果您只想选择某些列,您可以传递一个索引向量(例如c(1, 2, 5))或一个带有您想要保留的列名的向量(例如c("variable1", "variable5")。实际上它们有很多方法,你可能想看看here
  • @sanuali0123 这里有更多关于the R index system的提示。请用谷歌搜索一下,这是使用 R 对象的基础。另请检查:cran.r-project.org/doc/contrib/Paradis-rdebuts_en.pdf(第 3.5.4 和 3.5.5 部分)。
  • 用于按 groupby(variable) 排序给出错误,我做错了什么 res % res[order(-res$Freq), ]
【解决方案2】:

您可以计算 aggregate 中的 unique 值中的 length

res <- aggregate(. ~ city, df11, function(x) length(unique(x)))
res
#   city uniqueid name age country language gender
# 1    A        3    3   3       3        2      1
# 2    B        2    2   2       2        2      2
# 3    C        4    4   4       4        2      4
# 4    D        1    1   1       1        1      1
# 5    E        1    1   1       1        1      1
# 6    F        1    1   1       1        1      1
# 7    S        3    3   3       3        3      2
# 8    W        1    1   1       1        1      1

【讨论】:

  • 其实这只是城市列的一个例子,所以我想在excel中导出摘要,第一列excel应该是所有列名,然后第二列是数据框中标题的选项,第三列将类似于数据中的选项计数。
  • @sanuali0123 是的,这与您在上面评论的内容相似。您能否详细说明您的预期输出?通过xlsx::write.xlsx(res, "res.xlsx")导出时有什么问题?
  • @sanuali0123 另外,如果您查看?reshape(),您将看到如何将此表从长格式转换为宽格式(将“姓名”、“年龄”等作为列的值)变量”)。请展示您迄今为止尝试过的内容...
猜你喜欢
  • 2020-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-22
  • 2017-04-27
  • 1970-01-01
  • 2016-04-08
  • 2020-07-24
相关资源
最近更新 更多