gpt4 book ai didi

r - 根据类别分析多项选择题和多项选择答案

转载 作者:行者123 更新时间:2023-12-01 16:46:38 24 4
gpt4 key购买 nike

我有一个看起来像这样的数据框

Country    <- rep(c("Austria", "Austria","Belgium", "Belgium", "Spain", "Slovenia", "France"), times=3)
Institute <- rep(c("Inst 1","Inst 2","Inst 3","Inst 4","Inst 5","Inst 6","Inst 7"), times=3)
Ans <- rep(c(1,2,3,1,NA,2,2),times=3)
Category.1 <- rep(c("Cat 1", "Cat 2", "Cat 2", "Cat 2","Cat 2", "Cat 1", "Cat 1"),times=3)
Category.2 <- rep(c("P", "L", "M", "P", "P", "L", "M"),times=3)
qs <- c(rep("Q1.a-Some Text", times=7),rep("Q1.b-Some Text", times=7), rep("Q1.c-Some Text", times=7))
df <- data.frame(Country=Country,Institute=Institute, Category.1=Category.1, Category.2=Category.2, qs=qs, Ans=Ans)
df<-df %>% spread(qs,Ans)
head(df)

Country Institute Category.1 Category.2 Q1.a-Some Text Q1.b-Some Text Q1.c-Some Text
1 Austria Inst 1 Cat 1 P 1 1 1
2 Austria Inst 2 Cat 2 L 2 2 2
3 Belgium Inst 3 Cat 2 M 3 3 3
4 Belgium Inst 4 Cat 2 P 1 1 1
5 France Inst 7 Cat 1 M 2 2 2
6 Slovenia Inst 6 Cat 1 L 2 2 2

数据框的简短说明:有一些问题,比如 Q1,对于这个问题有多个“子问题”,比如 a、b、c,其中每个“子问题/选项”受访者被要求使用一定的范围来回答,在本例中为 1 到 3。我的范围是计算每个子问题、每个响应的相对频率。所以,我使用这个功能:

multichoice<-function(data, question.prefix){
index<-grep(question.prefix, names(data)) # identifies the index for the available options in Q.12
cases<-length(index) # The number of possible options / columns

# Identify the range of possible answers for each question
# Step 1. Search for the min in each col and across each col choose the min
# step 2. Search for the max in each col and across each col choose the max

mn<-min(data[,index[1:cases]], na.rm=T)
mx<-max(data[,index[1:cases]], na.rm=T)
d = colSums(data[, index] != 0, na.rm = TRUE) # The number of elements across column vector, that are different from zero.

vec<-matrix(,nrow=length(mn:mx),ncol=cases)

for(j in 1:cases){
for(i in mn:mx){
vec[i,j]=sum(data[, index[j]] == i, na.rm = TRUE)/d[j] # This stores the relative responses for option j for the answer that is i
}
}

vec1<-as.data.frame(vec)
names(vec1)<-names(data[index])
vec1<-t(vec1)
return(vec1)
}

调用该函数,我得到所需的数据帧。

q1  <- as.data.frame(multichoiceq4(df,"^Q1")) 
head(q1)

V1 V2 V3
Q1.a-Some Text 0.3333333 0.5 0.1666667
Q1.b-Some Text 0.3333333 0.5 0.1666667
Q1.c-Some Text 0.3333333 0.5 0.1666667

这表明对于选项“a”,33% 的参与者回答为 1,50% 的参与者回答为 2 等等...

我的问题

我想计算,相同但以类别为条件。因此,我想看看基于 category1、category2 的相对频率如何。有人可以建议我如何做到这一点吗?

最佳答案

我认为您可以通过将数据保持为长格式(即不要执行 df<-df %>% spread(qs,Ans) )并使用 dplyr 来使代码更加灵活。 ,例如:

这部分本质上重现了 multichoice 的功能功能:

df %>% 
group_by(qs,Ans) %>%
summarize(total=n()) %>%
filter(!is.na(Ans)) %>%
mutate(frac=total/sum(total)) %>%
dcast(qs~Ans,value.var='frac')
# qs 1 2 3
# 1 Q1.a-Some Text 0.3333333 0.5 0.1666667
# 2 Q1.b-Some Text 0.3333333 0.5 0.1666667
# 3 Q1.c-Some Text 0.3333333 0.5 0.1666667

这个例子给出了如何修改它以考虑类别的示例。

df %>% 
group_by(qs,Category.1,Ans) %>%
summarize(total=n()) %>%
filter(!is.na(Ans)) %>%
mutate(frac=total/sum(total)) %>%
dcast(qs~Ans+Category.1,value.var='frac')
# qs 1_Cat 1 1_Cat 2 2_Cat 1 2_Cat 2 3_Cat 2
# 1 Q1.a-Some Text 0.3333333 0.3333333 0.6666667 0.3333333 0.3333333
# 2 Q1.b-Some Text 0.3333333 0.3333333 0.6666667 0.3333333 0.3333333
# 3 Q1.c-Some Text 0.3333333 0.3333333 0.6666667 0.3333333 0.3333333

关于r - 根据类别分析多项选择题和多项选择答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37466489/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com