Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 无论元素的顺序如何,如何计算数据帧中的字符串数?_R_Count_Dplyr_Duplicates - Fatal编程技术网

R 无论元素的顺序如何,如何计算数据帧中的字符串数?

R 无论元素的顺序如何,如何计算数据帧中的字符串数?,r,count,dplyr,duplicates,R,Count,Dplyr,Duplicates,我试图计算具有特定元素分组的字符串的数量,而不考虑顺序。我看到一些答案,讨论如何删除它们,或者如何找出它们是否相等,但我需要计算它们的数量 示例数据集(为旅行打包的项目): 人月项目 亚当1号鞋 亚当1号帽子 弗兰克1号帽子 弗兰克1号鞋 我正在使用打包%summary\u all(funs(toString(unique())))来获取 Person Month Item Adam 1 Shoe, Hat Frank 1 Hat,

我试图计算具有特定元素分组的字符串的数量,而不考虑顺序。我看到一些答案,讨论如何删除它们,或者如何找出它们是否相等,但我需要计算它们的数量

示例数据集(为旅行打包的项目):

人月项目 亚当1号鞋 亚当1号帽子 弗兰克1号帽子 弗兰克1号鞋 我正在使用
打包%summary\u all(funs(toString(unique())))
来获取

Person Month Item Adam 1 Shoe, Hat Frank 1 Hat, Shoe 人月项目 亚当1号鞋、帽子 弗兰克:帽子、鞋子 然后我使用
grouped\u packing%group\u by(Item)%%>%summary(count=n())

R为每个列表提供了一个1的计数,而我真的希望它忽略排序并告诉我有两个相同的列表。我该怎么做

编辑:添加更多数据

Person Month Item Adam 1 Shoe Adam 1 Hat Frank 1 Hat Frank 1 Shoe Sally 2 Shoe Sally 2 Hat Sally 2 Shoe Sally 2 Hat Jen 3 Belt Jen 4 Belt 人月项目 亚当1号鞋 亚当1号帽子 弗兰克1号帽子 弗兰克1号鞋 莎莉2号鞋 萨利2号帽子 莎莉2号鞋 萨利2号帽子 仁三带 仁4带 分组:

Person Month Item Adam 1 Shoe, Hat Frank 1 Hat, Shoe Sally 2 Shoe, Hat Sally 2 Shoe, Hat Jen 3 Belt Jen 3 Belt 人月项目 亚当1号鞋、帽子 弗兰克:帽子、鞋子 莎莉2号鞋、帽子 莎莉2号鞋、帽子 仁三带 仁三带 我想以以下结果结束:

Item Groups N Shoe, Hat 4 Belt 2 项目组N 鞋帽 皮带2
这会改变方法吗?

尝试使用
mutate
而不是
summary

df1 %>% 
   group_by(Item,Month) %>% 
 mutate(N=n())

# A tibble: 4 x 4
# Groups:   Item, Month [2]
  Person Month Item      N
  <chr>  <int> <chr> <int>
1 Adam       1 Shoe      2
2 Adam       1 Hat       2
3 Frank      1 Hat       2
4 Frank      1 Shoe      2
df1%>%
分组单位(项目、月份)%>%
变异(N=N())
#一个tibble:4x4
#分组:项目,月份[2]
人月项目N
1亚当1鞋2
2亚当1帽子2
3弗兰克1帽子2
4弗兰克1号鞋2

按照@NelsonGon使用
n()给出的答案,您需要在总结之前先数一数:

library(tidyverse)

packing <- tribble(
  ~Person,    ~Month,    ~Item,
  "Adam",        1,       "Shoe",
  "Adam",        1,       "Hat",
  "Frank",       1,       "Hat",
  "Frank",       1,       "Shoe" 
)

packing %>% 
  group_by(Person, Month) %>% 
  summarise_all(funs(N = n(), Item = toString(unique(.))))

# A tibble: 2 x 4
# Groups:   Person [?]
  Person Month     N Item     
  <chr>  <dbl> <int> <chr>    
1 Adam       1     2 Shoe, Hat
2 Frank      1     2 Hat, Shoe
您需要首先使用
arrange
进行排序,以避免相同的列表以不同的方式排列。然后删除剩余的分组,用
项目重新分组
,并进行适当总结


另一方面,“列表”在R中是一个非常特殊的词,因此在初次编辑之前会出现混乱。如果您想进一步探索,可能值得一看。

这里有一个解决方案,使用
tapply()
from base
R

attach(packing)  # attach the data frame
tapply(Item, list(Person, Month), function(x) length(unique(x)))

      1
Adam  2
Frank 2

如果我和1岁的莎莉再吵架一次,这会使他们所有人的3号鞋都变成N吗?因为我想要两个给亚当/弗兰克,一个给萨莉。因为这是一个独特的分组。你也可以按个人分组(不能测试)。当前远离我的计算机。如果您添加
Person
作为分组变量(类似于zacks response),它将为您提供Sally的项目总数(编辑:正如Nelson刚才指出的那样)。这非常有用!谢谢你,扎克。是的,我意识到列表并不是这个问题的正确词汇。如果在运行了您提供的代码之后,我的第三行出现了Sally,2,1,Shoe,Hat。我想知道有3个“鞋/帽”组合。。我该怎么做?如果我按项目和总和分组,我会得到5,这将复制数字。我在我原来的假设答案中添加了一个更详细的例子——基本上只是排序和重新分组!谢谢:)
packing %>% 
  group_by(Person, Month) %>% 
  arrange(Item) %>%
  summarise_all(funs(N = n(), Item = toString(unique(.)))) %>%
  ungroup %>% group_by(Item) %>%
  summarize(N = n())

# A tibble: 2 x 2
  Item          N
  <chr>     <int>
1 Belt          2
2 Hat, Shoe     3
attach(packing)  # attach the data frame
tapply(Item, list(Person, Month), function(x) length(unique(x)))

      1
Adam  2
Frank 2