首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何用R来总结这些数据?

我如何用R来总结这些数据?
EN

Stack Overflow用户
提问于 2019-03-05 01:53:53
回答 3查看 134关注 0票数 1

我正在分析不同购物场所之间的顾客流动情况。我有这样的数据:

代码语言:javascript
复制
df <- data.frame(customer.id=letters[seq(1,7)], 
                 shop.1=c(1,1,1,1,1,0,0),
                 shop.2=c(0,0,1,1,1,1,0),
                 shop.3=c(1,0,0,0,0,0,1))
df
代码语言:javascript
复制
#>   customer.id shop.1 shop.2 shop.3
#> 1           a      1      0      1
#> 2           b      1      0      0  
#> 3           c      1      1      0 
#> 4           d      1      1      0 
#> 5           e      1      1      0 
#> 6           f      0      1      0 
#> 7           g      0      0      1

因此,例如:

  • 顾客"a“只在1和3商店购物,
  • 顾客"b“只在1店购物,
  • 顾客"c“只在1和2商店购物,
  • 等。

我想总结一下如下的数据:

代码语言:javascript
复制
#>           shop.1 shop.2 shop.3 
#> shop.1         5      3      1
#> shop.2         3      4      0       
#> shop.3         1      0      2       

例如,第1行的内容如下:

  • 5人在1店和1店都购物(这显然是多余的观察)
  • 3人在第一铺和第二铺购物
  • 一人在第一及第三铺购物

我如何做到这一点(请注意:我的数据集中有很多商店,所以首选可伸缩的方法)?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-03-05 03:37:42

在进行了一些基本操作之后,crossprod可以处理您想要做的事情,将其分别放在代表customershop的2列中:

代码语言:javascript
复制
tmp <- cbind(df[1],stack(df[-1]))
tmp <- tmp[tmp$values==1,]

crossprod(table(tmp[c(1,3)]))

#        ind
#ind      shop.1 shop.2 shop.3
#  shop.1      5      3      1
#  shop.2      3      4      0
#  shop.3      1      0      2
票数 4
EN

Stack Overflow用户

发布于 2019-03-05 02:07:23

您想要表出shop.*变量的共生关系(shop.*)变量:

代码语言:javascript
复制
df[,2:4] <- sapply(df[,2:4], function(x) { ifelse(x=="", 0, 1) } )

( 1)据说可以用ftable(xtabs(...))来完成,但我和它斗争了很长时间,但无法得到它。我最接近的是:

代码语言:javascript
复制
> ftable(xtabs(~ shop.1 + shop.2 + shop.3, df))

              shop.3 0 1
shop.1 shop.2           
0      0             0 1
       1             1 0
1      0             1 1
       1             3 0

2)如@thelatemail所示,你也可以:

代码语言:javascript
复制
# Transform your df from wide-form to long-form...
library(dplyr)
library(reshape2)
occurrence_df <- reshape2::melt(df, id.vars='customer.id') %>%
                 dplyr::filter(value==1)

   customer.id variable value
1            a   shop.1     1
2            b   shop.1     1
3            c   shop.1     1
4            d   shop.1     1
5            e   shop.1     1
6            c   shop.2     1
7            d   shop.2     1
8            e   shop.2     1
9            f   shop.2     1
10           a   shop.3     1
11           g   shop.3     1

实际上,我们可以在筛选器之后删除value列,这样我们就可以传输%>% select(-value)了。

代码语言:javascript
复制
   customer.id variable
1            a   shop.1
2            b   shop.1
3            c   shop.1
4            d   shop.1
5            e   shop.1
6            c   shop.2
7            d   shop.2
8            e   shop.2
9            f   shop.2
10           a   shop.3
11           g   shop.3

然后,与@thelatemail的回答相同的交叉步骤:

代码语言:javascript
复制
crossprod(table(occurrence_df))

        variable
variable shop.1 shop.2 shop.3
  shop.1      5      3      1
  shop.2      3      4      0
  shop.3      1      0      2

(脚注:

  • 首先,您的数据应该是数字(或因子),而不是字符串。您希望将"x“转换为1,将"”转换为0。
  • 如果它们是字符串,因为它们来自read.csv,那么使用read.csv参数stringsAsFactors=TRUE使它们成为因子,或者使用colClasses使它们成为数字,并查看其中的所有重复问题。)
票数 3
EN

Stack Overflow用户

发布于 2019-03-05 04:18:21

事实上,矩阵操作似乎足够了,因为数据帧只有01

首先,排除customer.id列并将data.frame更改为matrix。这可能很容易。(mydf是数据帧的名称。)

代码语言:javascript
复制
# base R way
as.matrix(mydf[,-1])
#>      shop.1 shop.2 shop.3
#> [1,]      1      0      1
#> [2,]      1      0      0
#> [3,]      1      1      0
#> [4,]      1      1      0
#> [5,]      1      1      0
#> [6,]      0      1      0
#> [7,]      0      0      1

library(dplyr) #dplyr way
(mymat <-
  mydf %>% 
  select(-customer.id) %>% 
  as.matrix())
#>      shop.1 shop.2 shop.3
#> [1,]      1      0      1
#> [2,]      1      0      0
#> [3,]      1      1      0
#> [4,]      1      1      0
#> [5,]      1      1      0
#> [6,]      0      1      0
#> [7,]      0      0      1

对于这个矩阵,只需按下面的方式进行矩阵操作即可。

代码语言:javascript
复制
t(mymat) %*% mymat
#>        shop.1 shop.2 shop.3
#> shop.1      5      3      1
#> shop.2      3      4      0
#> shop.3      1      0      2

你可以得到答案。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54994318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档