【问题标题】:Creating a count table of unique values when there are multiple values in a single cell using R使用 R 在单个单元格中有多个值时创建唯一值的计数表
【发布时间】:2019-04-26 18:01:40
【问题描述】:

我正在尝试从如下所示的数据表创建计数表:

df <- data.frame("Spring" = c("skirt, pants, shirt", "tshirt"), "Summer" = 
c("shorts, skirt", "pants, shoes"), Fall = c("Scarf", "purse, pants"))

               Spring        Summer         Fall
1 skirt, pants, shirt shorts, skirt        Scarf
2              tshirt  pants, shoes purse, pants

然后是一个最后看起来像这样的计数表:

output <- data.frame("Spring" = 4, "Summer" = 4, Fall = 3)

  Spring Summer Fall
1      4      4    3

所以,我只想计算每个季节列中的唯一值。由于逗号分隔 1 个单元格内的值,我遇到了麻烦。我尝试使用 length(unique())),但由于列的原因,它没有给我正确的数字。

感谢任何帮助!!!

【问题讨论】:

  • 我不知道怎么把桌子放在这里...对不起!我会努力解决的
  • 请提出问题reproducible。
  • @NelsonGon 我试过了,希望对你有帮助!

标签: r count unique


【解决方案1】:

tidyverse 的一种可能是:

df %>%
 mutate_if(is.factor, as.character) %>%
 gather(var, val) %>%
 mutate(val = strsplit(val, ", ")) %>%
 unnest() %>%
 group_by(var) %>%
 summarise(val = n_distinct(val))

  var      val
  <chr>  <int>
1 Fall       3
2 Spring     4
3 Summer     4

如果你想完全匹配所需的输出,那么你可以添加spread():

df %>%
 mutate_if(is.factor, as.character) %>%
 gather(var, val) %>%
 mutate(val = strsplit(val, ", ")) %>%
 unnest() %>%
 group_by(var) %>%
 summarise(val = n_distinct(val)) %>%
 spread(var, val)

   Fall Spring Summer
  <int>  <int>  <int>
1     3      4      4

或者使用@Sonny 的基本思想(这只需要dplyr):

df %>%
 mutate_if(is.factor, as.character) %>%
 summarise_all(list(~ n_distinct(unlist(strsplit(., ", ")))))

  Spring Summer Fall
1      4      4    3

【讨论】:

  • 谢谢,但是,这不适用于我的实际数据,因为我遇到了某些列相同的情况,例如表一开始的结构是这样的。你知道如何解决这个问题吗???
  • df
  • 你能描述一下具体是什么问题吗?
  • 现在我看到了问题所在。您可以使用:df %&gt;% mutate_if(is.factor, as.character) %&gt;% mutate(test = strsplit(test, ", ")) %&gt;% unnest() %&gt;% summarise_all(n_distinct)。
  • 太棒了!!非常感谢。你帮了大忙!
【解决方案2】:

使用summarise_all:

getCount <- function(x) {
  x <- as.character(x)
  length(unique(unlist(strsplit(x, ","))))
}

library(dplyr)
df %>%
  summarise_all(funs(getCount))
  Spring Summer Fall
1      4      4    3

【讨论】:

  • 谢谢,但我的数据没有得到正确答案。这就是我所拥有的:这是我的实际数据:test
猜你喜欢
  • 1970-01-01
  • 2016-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-09
  • 1970-01-01
  • 2012-06-01
  • 2021-12-16
相关资源
最近更新 更多