我的最终目标是对这些数据做一系列的chisq.test,根据“性别”比较“经销商”、“商店”和“运输”的值。我使用spread和gather创建一个“女性”列,一个“男性”列,然后计划使用group_by & map按'key‘组运行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))

发布于 2018-01-11 12:56:51
您需要在添加group_by(gender)和扩展之前进行id,即
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_number和1: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行
发布于 2018-01-11 15:03:29
@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
https://stackoverflow.com/questions/48206727
复制相似问题