首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >tidyr::%>% () %>% mutate() %>%tidyr()出乎意料地返回NA

tidyr::%>% () %>% mutate() %>%tidyr()出乎意料地返回NA
EN

Stack Overflow用户
提问于 2018-01-11 12:08:40
回答 2查看 1.4K关注 0票数 0

我的最终目标是对这些数据做一系列的chisq.test,根据“性别”比较“经销商”、“商店”和“运输”的值。我使用spreadgather创建一个“女性”列,一个“男性”列,然后计划使用group_by & map按'key‘组运行chisq.test,这是在gather参数中创建的。我做错了什么,因为我被分组NA回来了。

下面的代码产生了我的两难处境。

代码语言:javascript
复制
set.seed(123)

df_ <- data_frame(gender = sample(c('male','female'),100,T),
           dealer = sample(1:5,100,T),
           store = sample(1:5,100,T),
           transport = sample(1:5,100,T))
df_ %>% 
  gather(key,value,-gender) %>% 
  mutate(id = 1:nrow(.)) %>% 
  spread(gender,value)

这是我想要的结果的data_frame

代码语言:javascript
复制
data_frame(key = sample(c('dealer','store','transport'),50,T),
       male = sample(1:5,50,T),
       female = sample(1:5,50,T))

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-11 12:56:51

您需要在添加group_by(gender)和扩展之前进行id,即

代码语言:javascript
复制
library(tidyverse)

df_ %>% 
 gather(key, value, -gender) %>% 
 group_by(gender) %>% 
 mutate(id = row_number()) %>% 
 spread(gender, value)

注意:1:nrow(.)代替row_number()会因为分组而失败。这是因为它接受整个数据帧的序列(而不是每个组的序列),并试图将其分配给每个组。因此,您得到的错误与长度

mutate_impl(.data,dots)中的错误:列id必须长度为156 (组大小)或1,而不是300

如果你说的是... %>%mutate(id = 1:length(key)),那就好了

结果(row_number1:length(key))都是,

1交易商1 3 4 2交易商2 3 2 3交易商3 1 4 4交易商4 5 3 5交易商5 4 4 6交易商6 5 2 7交易商7 3 3 8交易商8 1 2 9交易商9 2 5 10毒贩102# ..。还有158行

票数 3
EN

Stack Overflow用户

发布于 2018-01-11 15:03:29

@elliot,虽然@Sotos给出了一个很好的答案,你对tidyverse的挑战,我有点困惑,为什么你要经历这么多额外的努力。您的最终目标是运行chisq.test的性别与其他每一个(经销商,商店和运输)。您的原始数据集不需要任何修改就可以做到这一点!

代码语言:javascript
复制
require(tidyverse)
set.seed(123)
yourdata <- data_frame(gender = sample(c('male','female'),100,T),
              dealer = sample(1:5,100,T),
              store = sample(1:5,100,T),
              transport = sample(1:5,100,T))
yourdata

# A tibble: 100 x 4 gender dealer store transport <chr> <int> <int> <int> 1 female 2 2 5 2 male 2 4 2 3 female 2 2 1

完全可以按原样使用!您可能需要更改数据的其他原因,但它是tidy,因为它代表的是每一行一个案例或个人。

编辑(1月16日),以实现您所述的最终目标,您只需:

代码语言:javascript
复制
require(dplyr)
require(broom)
allofthem <- lapply(yourdata[-1], function(y) tidy(chisq.test(x = yourdata$gender, y = y )))
allofthem <- bind_rows(allofthem, .id = "dependentv")
allofthem

您可能还想看看lsr包,它将实现卡方独立(关联测试)并提供更多的信息输出。还请注意,从统计的角度来看,您正在运行很多测试,并且应该适当地纠正您的信心。参见例如http://rpubs.com/ibecav/290361

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

https://stackoverflow.com/questions/48206727

复制
相关文章

相似问题

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