R 无论元素的顺序如何,如何计算数据帧中的字符串数?
我试图计算具有特定元素分组的字符串的数量,而不考虑顺序。我看到一些答案,讨论如何删除它们,或者如何找出它们是否相等,但我需要计算它们的数量 示例数据集(为旅行打包的项目): 人月项目 亚当1号鞋 亚当1号帽子 弗兰克1号帽子 弗兰克1号鞋 我正在使用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,
打包%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 baseR
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