我的最终目标是对这些数据进行一系列chisq.test
,比较'经销商'存储'的价值。和'运输'由性别'。我正在使用spread
和gather
来创建一个“女性”栏目。和男性的一个然后计划使用group_by
& map
以chisq.test
为基础运行gather
按键',这是在我的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);
答案 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_number
和1: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)
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