tidyr :: gather()%>%mutate()%>%spread()意外返回NA \ n

时间:2018-01-11 12:08:40

标签: r dplyr tidyr

我的最终目标是对这些数据进行一系列chisq.test,比较&#39;经销商&#39;存储&#39;的价值。和&#39;运输&#39;由性别&#39;。我正在使用spreadgather来创建一个“女性”栏目。和男性的一个然后计划使用group_by&amp; mapchisq.test为基础运行gather按键&#39;,这是在我的NA参数中创建的。我做错了什么,因为我已经将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

这是我期望结果的data_frame(key = sample(c('dealer','store','transport'),50,T), male = sample(1:5,50,T), female = sample(1:5,50,T))

onload(canvas,ctx);

which produces

2 个答案:

答案 0 :(得分:3)

在添加group_by(gender)和传播之前,您需要id,即

library(tidyverse)

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

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

  

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

如果你说... %>%mutate(id = 1:length(key))那就没问题了

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

# A tibble: 168 x 4
      key    id female  male
 *  <chr> <int>  <int> <int>
 1 dealer     1      3     4
 2 dealer     2      3     2
 3 dealer     3      1     4
 4 dealer     4      5     3
 5 dealer     5      4     4
 6 dealer     6      5     2
 7 dealer     7      3     3
 8 dealer     8      1     2
 9 dealer     9      2     5
10 dealer    10      2     2
# ... with 158 more rows

答案 1 :(得分:0)

@elliot虽然@Sotos对tidyverse所面临的挑战给出了很好的答案,但我对你为什么要付出额外的努力感到有点困惑。您所说的最终目标是针对其他人(经销商,商店和运输商)运行chisq.test性别。您的原始数据集不需要任何修改来执行此操作!

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日)要实现您所述的最终目标,您必须:

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