首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >tidyr扩展函数在期望紧向量时生成稀疏矩阵

tidyr扩展函数在期望紧向量时生成稀疏矩阵
EN

Stack Overflow用户
提问于 2014-12-16 01:41:25
回答 1查看 5.3K关注 0票数 12

我正在学习来自plyr的dplyr,我希望从xtabs的输出生成(每个组)列(每次交互)。

简短摘要:我得到了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
A    B
1    NA
NA   2

当我想

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
A    B
1    2

xtabs数据如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> xtabs(data=data.frame(P=c(F,T,F,T,F),A=c(F,F,T,T,T)))
       A
P       FALSE TRUE
  FALSE     1    2
  TRUE      1    1

现在do(想要数据帧中的数据,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> xtabs(data=data.frame(P=c(F,T,F,T,F),A=c(F,F,T,T,T))) %>% as.data.frame
      P     A Freq
1 FALSE FALSE    1
2  TRUE FALSE    1
3 FALSE  TRUE    2
4  TRUE  TRUE    1

现在,我想要一个行输出,列是级别之间的交互。我要找的是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FALSE_FALSE TRUE_TRUE FALSE_TRUE TRUE_FALSE
          1         1          2          1

但我却得到了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> xtabs(data=data.frame(P=c(F,T,F,T,F),A=c(F,F,T,T,T))) %>% 
    as.data.frame %>% 
    unite(S,A,P) %>% 
    spread(S,Freq)
  FALSE_FALSE FALSE_TRUE TRUE_FALSE TRUE_TRUE
1           1         NA         NA        NA
2          NA          1         NA        NA
3          NA         NA          2        NA
4          NA         NA         NA         1

我显然是误会了一些事。我在这里寻找与reshape2 2的代码相当的代码(使用magrittr管道来保持一致性):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> xtabs(data=data.frame(P=c(F,T,F,T,F),A=c(F,F,T,T,T))) %>% 
    as.data.frame %>% # can be omitted. (safely??)
    melt %>% 
    mutate(S=interaction(P,A),value=value) %>% 
    dcast(NA~S)
Using P, A as id variables
  NA FALSE.FALSE TRUE.FALSE FALSE.TRUE TRUE.TRUE
1 NA           1          1          2         1

(这里使用的是NA,因为在这个简化的示例中没有分组变量)

更新-有趣的是,添加一个分组列似乎解决了这个问题--为什么它在我不告诉它的情况下合成了一个分组列(大概来自row_name)?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> xtabs(data=data.frame(h="foo",P=c(F,T,F,T,F),A=c(F,F,T,T,T))) %>% 
  as.data.frame %>% 
  unite(S,A,P) %>% 
  spread(S,Freq)
    h FALSE_FALSE FALSE_TRUE TRUE_FALSE TRUE_TRUE
1 foo           1          1          2         1

这似乎是一个局部的解决方案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-16 16:35:57

这里的关键是spread不聚合数据。

因此,如果您还没有使用xtabs进行第一次聚合,那么您将执行以下操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a <- data.frame(P=c(F,T,F,T,F),A=c(F,F,T,T,T), Freq = 1) %>% 
    unite(S,A,P)
a
##             S Freq
## 1 FALSE_FALSE    1
## 2  FALSE_TRUE    1
## 3  TRUE_FALSE    1
## 4   TRUE_TRUE    1
## 5  TRUE_FALSE    1

a %>% spread(S, Freq)
##   FALSE_FALSE FALSE_TRUE TRUE_FALSE TRUE_TRUE
## 1           1         NA         NA        NA
## 2          NA          1         NA        NA
## 3          NA         NA          1        NA
## 4          NA         NA         NA         1
## 5          NA         NA          1        NA

这样做没有任何其他意义(没有聚合)。

基于fill参数的帮助文件,这是可预测的:

如果其他变量和键列的每个组合都没有值,则将替换该值。

在您的示例中,没有任何其他变量可以与键列组合。如果有,那么..。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
b <- data.frame(P=c(F,T,F,T,F),A=c(F,F,T,T,T), Freq = 1
                                , h = rep(c("foo", "bar"), length.out = 5)) %>% 
    unite(S,A,P)
b
##             S Freq   h
## 1 FALSE_FALSE    1 foo
## 2  FALSE_TRUE    1 bar
## 3  TRUE_FALSE    1 foo
## 4   TRUE_TRUE    1 bar
## 5  TRUE_FALSE    1 foo

> b %>% spread(S, Freq)
## Error: Duplicate identifiers for rows (3, 5)

...it会失败,因为它不能聚合第3行和第5行(因为它不是为之设计的)。

使用tidyr/dplyr的方法是group_bysummarize,而不是xtabs,因为summarize保留分组列,因此spread可以判断哪些观测属于同一行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
b %>%   group_by(h, S) %>%
    summarize(Freq = sum(Freq))
## Source: local data frame [4 x 3]
## Groups: h
## 
##     h           S Freq
## 1 bar  FALSE_TRUE    1
## 2 bar   TRUE_TRUE    1
## 3 foo FALSE_FALSE    1
## 4 foo  TRUE_FALSE    2

b %>%   group_by(h, S) %>%
    summarize(Freq = sum(Freq)) %>%
    spread(S, Freq)
## Source: local data frame [2 x 5]
## 
##     h FALSE_FALSE FALSE_TRUE TRUE_FALSE TRUE_TRUE
## 1 bar          NA          1         NA         1
## 2 foo           1         NA          2        NA
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27501577

复制
相关文章
ClickHouse在苏宁用户画像场景的最佳实践
---- 关注 「 Cli肉眼品世界 」 , 后台回复 cksn 可获取PDF
肉眼品世界
2021/06/08
1.3K0
无限滚动加载最佳实践
无限滚动(Infinite scrolling),有时候被称为无尽滚动(endless scrolling),这种技术允许用户在大量内容上滚动,眼中看不到结束的地方。这种技术很简单,就是页面往下滚动的时候保持刷新。
疯狂的技术宅
2019/03/27
4.3K0
无限滚动加载最佳实践
管理Salesforce用户的最佳实践
管理Salesforce用户看起来不困难,但是今天我们还是会介绍下管理Salesforce用户的最佳实践。使用不正确的方法管理用户和许可证可能导致企业数据完整性出现问题。最佳实践应用于Salesforce的很多地方,用户管理的方法也同样适用。
臭豆腐
2019/04/16
1.1K0
Java延迟加载的最佳实践应用示例!
作者 | S.L 来源 | http://r6d.cn/abGzy 代码中的很多操作都是Eager的,比如在发生方法调用的时候,参数会立即被求值。总体而言,使用Eager方式让编码本身更加简单,然而使用Lazy的方式通常而言,即意味着更好的效率。 延迟初始化 一般有几种延迟初始化的场景: 对于会消耗较多资源的对象:这不仅能够节省一些资源,同时也能够加快对象的创建速度,从而从整体上提升性能。 某些数据在启动时无法获取:比如一些上下文信息可能在其他拦截器或处理中才能被设置,导致当前bean在加载的时候可能获取
程序猿DD
2023/04/04
7980
Java延迟加载的最佳实践应用示例!
微服务前端数据加载的最佳实践
目前在不少团队里已经逐步实践落地了微服务架构,比如前端圈很流行的 BFF(Backend For Frontend)其实就是微服务架构的一种变种,即让前端团队维护一套“胶水层/接入层/API层”的服务,调用后台团队提供的若干个微服务,将微服务的结果进行逻辑组装,从而包装出对外的 API。
lucifer210
2021/05/10
9870
微服务前端数据加载的最佳实践
【前端探索】图片加载优化的最佳实践
图片加载的优化,是前端性能优化中,最划算的一项工作,往往工作量和难度都不大,但却能给页面性能带来极大极大的提升。
luciozhang
2023/04/22
7040
【前端探索】图片加载优化的最佳实践
Kerberos 身份验证在 ChunJun 中的落地实践
Kerberos,在古希腊神话故事中,指的是一只三头犬守护在地狱之门外,禁止任何人类闯入地狱之中。
袋鼠云数栈
2022/12/16
1.6K0
PyTorch 最佳实践:模型保存和加载
PyTorch模型保存和加载有两种方法,官方最佳实践指南推荐其中一种,但似乎效果没啥区别。最近做模型量化,遇到一个意外的错误,才理解了最佳实践背后的原理,以及不遵循它可能会遇到什么问题。
McGL
2020/09/21
1.9K0
Jenkins 在 Kubernetes 上的最佳实践
Jenkins 是由 Java 编写的编排引擎,在 Full GC 时会 Stop The World(STW)。在大规模构建时,STW 可能会导致 Jenkins 无法处理新的请求。
陈少文
2021/06/05
1.1K0
BFF模式:微服务前端数据加载的最佳实践?
设想一个场景,你需要使用微服务构建电子商务应用程序。你可以为客户、订单、产品、购物车等提供微服务,微服务暴露 API 给前端使用。
winty
2021/04/29
1.9K0
BFF模式:微服务前端数据加载的最佳实践?
作者|Viduni Wickramarachchi 译者|吴留坡 策划|田晓旭 设想一个场景,你需要使用微服务构建电子商务应用程序。你可以为客户、订单、产品、购物车等提供微服务,微服务暴露 API 给前端使用。 但是,微服务提供给前端的数据可能不会按照前端需要的方式进行编排或过滤。 这种情况下,前端需要一些逻辑来重新处理这些数据,同时在用户端使用这样的逻辑会占用更多的浏览器资源。 在这样的情况下,我们可以使用 BFF 将一些前端逻辑转移到中间层,中间层就是 BFF。当前端请求一些数据时,它将调用 BFF 中
深度学习与Python
2023/04/01
7080
BFF模式:微服务前端数据加载的最佳实践?
前后端分离后,RESTful API 最佳实践
它的大原则容易把握,但是细节不容易做对。本文总结 RESTful 的设计细节,介绍如何设计出易于理解和使用的 API。
芋道源码
2019/05/21
9470
前后端分离后,RESTful API 最佳实践
swagger 在 egg 项目中的最佳实践
swagger 是一个 RESTful 接口的基于 YAML、JSON 语言的文档和代码在线自动生成工具,它让部署管理 API 变得前所未有的简单。swagger 在 java 界广为使用,其他语言同样可以方便地集成使用。本文以基于 node.js 的企业级应用框架 egg.js 为例,集成 swagger 以根据函数注释自动生成接口文档。
CS逍遥剑仙
2021/05/24
3.7K0
干货 | DevSecOps在携程的最佳实践
作为业务覆盖机票、酒店、度假、汽车票、火车票、支付等各个方面,为全球用户提供服务的在线旅游网站,携程每周都会有数以万计的应用发布次数,如何保证每一次发布代码的安全性成为了DevSecOps实践中最大的挑战。
携程技术
2020/07/14
2.5K0
linux如何查看所有的用户和组信息?
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/112960.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/08
6.9K0
linux如何查看所有的用户和组信息?
6个增加Salesforce用户采用率的最佳实践
想象下这个场景:你的公司正在实施Salesforce,作为一个系统管理员,你非常兴奋你所做的工作可以让Salesforce促进团队的工作。你导入数据,自定义接口,并根据用户的需求拓展新的功能。你还创建了很多自定义报表并设计了很多完美的仪表盘。你已经向主管演示了系统,他们很满意——你的经理也很喜欢你。你满怀信心并渴望分享你的专家经验,你推广系统并希望听到生产力和关键指标有很大突破的消息。但是很可惜你听到的并不是这些。
臭豆腐
2019/04/16
6000
一条命令查询所有mysql用户的授权信息
大大刺猬
2023/06/29
5301
一条命令查询所有mysql用户的授权信息
点击加载更多

相似问题

存储用户信息的最佳实践

10

返回用户信息的最佳实践

15

用户身份验证最佳实践

31

存储Facebook用户信息最佳实践?

19

在Redis中存储用户信息的最佳实践

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文