R 使用嵌套数据跨行和列循环
我有以下数据结构:分组会议。各小组经常举行不同的会议,每次会议的小组成员人数也各不相同R 使用嵌套数据跨行和列循环,r,loops,for-loop,if-statement,nested,R,Loops,For Loop,If Statement,Nested,我有以下数据结构:分组会议。各小组经常举行不同的会议,每次会议的小组成员人数也各不相同 $ GroupID : chr "1" "1" "1" "1" ... $ groupnames : chr "A&M" "A&M" "A&M" "A&M" ... $ MeetiID : chr "1" "1" "2" "2" ... $ Date_Mee
$ GroupID : chr "1" "1" "1" "1" ...
$ groupnames : chr "A&M" "A&M" "A&M" "A&M" ...
$ MeetiID : chr "1" "1" "2" "2" ...
$ Date_Meetings : chr "43293" "43293" "43298" "43298" ...
$ PersonID : num 171 185 171 185 185 113 135 113 135 113 ...
$ v_165 : chr "3" "3" "4" "3" ...
$ v_166 : chr "2" "2" "3" "3" ...
$ v_167 : chr "2" "4" "4" "3" ...
$ v_168 : chr "6" "7" "4" "5" ...
$ problemtypes_categories: chr "Knowledgeproblem" "Knowledgeproblem" "Motivationalproblem" "Coordinationproblem" ...
$ v_165_dicho : num 0 0 0 0 1 1 1 0 0 1 ...
$ v_166_dicho : num 0 0 0 0 0 0 0 0 0 0 ...
$ v_167_dicho : num 0 0 0 0 1 1 0 0 0 0 ...
现在我必须创建一个新变量,该变量应该是二进制(0/1),名称为agreement\u levels。因此,每次,一组中的一个人(关于同一次学习会议)与同一次会议中同一组的其他学习者有相同的问题类型类别时,两个学习者(或三个或四个,取决于各自会议的组大小)都应在协议变量处获得值1,否则他们都应获得0。当一个人(例如,四个学习者中的一个人)的问题类别与其他人不同时,所有人的一致性变量都为0。
如果同一次会议的数据集中只有1人,则必须有一个NA表示同意。然而,当一个人的problemtype变量为NA,且同一会议的数据集中有两个人时,两人的一致性均为0;但是,如果数据集中有4个人参加同一个会议,其中一个人的problemtype为NA,那么只有这个人,而不是其他人的problemtype为NA
我已经编写了一个命令,但它还没有工作,仍然没有考虑NAs:
GroupID1 <- df$GroupID[1:nrow,]
TreffID1 <- df$TreffID[1:nrow,]
for(i in 1:(GroupID1 -1){
for(j in 1:(TreffID1 -1){
if(df[i, 3] == df[i+1, 3]-1){
if(df[i, 15] == df[i+1, 15]-1){
df[c(i, i+1), 28] <- 1,
df[c(i, i+1), 28] <- 0
我没有使用循环,而是使用了R的
dplyr
。我不确定你的逻辑是否正确,因为有很多。例如,您没有指定NA problemtype和3个人的情况。但是这里有一个使用group\u by
的起点,因此您可以查看具有相同GroupID和TreffID的每组行,然后mutate
和case\u when
,它们根据条件将值分配给新列,然后执行类似n()
计算有多少行和n_distinct
计算不同行,因此如果它是==1,则我们知道它们都是相同的
library(tidyverse)
df <- df %>%
group_by(GroupID, TreffID) %>%
mutate(agreement_levels = case_when(n() == 1 ~ -1,
is.na(problemtypen_oberkategorien) & n() == 2 ~ 0,
is.na(problemtypen_oberkategorien) & n() > 2 ~ -1,
n_distinct(problemtypen_oberkategorien, na.rm = FALSE) == 1 ~ 1,
n_distinct(problemtypen_oberkategorien, na.rm = FALSE) > 1 ~ 0,
TRUE ~ -1),
agreement_levels = na_if(agreement_levels, -1)) %>%
select(GroupID, TreffID, problemtypen_oberkategorien, agreement_levels, everything())
库(tidyverse)
df%
分组依据(GroupID,TreffID)%>%
当(n()==1~-1时,变异(一致性水平=case),
is.na(problemtypen_oberkategorien)&n()==2~0,
is.na(problemtypen_oberkategorien)&n()>2~-1,
n_distinct(problemtypen_oberkategorien,na.rm=FALSE)==1~1,
n_distinct(problemtypen_oberkategorien,na.rm=FALSE)>1~0,
真~-1),
协议级别=不适用(协议级别,-1))%>%
选择(GroupID、TreffID、problemtypen\u oberkategorien、agreement\u levels、everything())
我用R的dplyr
代替了循环。我不确定你的逻辑是否正确,因为有很多。例如,您没有指定NA problemtype和3个人的情况。但是这里有一个使用group\u by
的起点,因此您可以查看具有相同GroupID和TreffID的每组行,然后mutate
和case\u when
,它们根据条件将值分配给新列,然后执行类似n()
计算有多少行和n_distinct
计算不同行,因此如果它是==1,则我们知道它们都是相同的
library(tidyverse)
df <- df %>%
group_by(GroupID, TreffID) %>%
mutate(agreement_levels = case_when(n() == 1 ~ -1,
is.na(problemtypen_oberkategorien) & n() == 2 ~ 0,
is.na(problemtypen_oberkategorien) & n() > 2 ~ -1,
n_distinct(problemtypen_oberkategorien, na.rm = FALSE) == 1 ~ 1,
n_distinct(problemtypen_oberkategorien, na.rm = FALSE) > 1 ~ 0,
TRUE ~ -1),
agreement_levels = na_if(agreement_levels, -1)) %>%
select(GroupID, TreffID, problemtypen_oberkategorien, agreement_levels, everything())
库(tidyverse)
df%
分组依据(GroupID,TreffID)%>%
当(n()==1~-1时,变异(一致性水平=case),
is.na(problemtypen_oberkategorien)&n()==2~0,
is.na(problemtypen_oberkategorien)&n()>2~-1,
n_distinct(problemtypen_oberkategorien,na.rm=FALSE)==1~1,
n_distinct(problemtypen_oberkategorien,na.rm=FALSE)>1~0,
真~-1),
协议级别=不适用(协议级别,-1))%>%
选择(GroupID、TreffID、problemtypen\u oberkategorien、agreement\u levels、everything())
如果您提供一些示例数据,会有所帮助。尝试使用dput(head(df))并粘贴结果。谢谢。现在,我不得不用德语变量名发布数据。problemtypen_oberkategorien是problemtype变量,TreffID是MeetingID在您的数据示例中有哪些相关变量?我很确定像v_164
这样的开放式问题是不相关的。请将您的示例仅限于相关变量。如果您提供一些示例数据,将会有所帮助。尝试使用dput(head(df))并粘贴结果。谢谢。现在,我不得不用德语变量名发布数据。problemtypen_oberkategorien是problemtype变量,TreffID是MeetingID在您的数据示例中有哪些相关变量?我很确定像v_164
这样的开放式问题是不相关的。请将您的示例仅限于相关变量。谢谢。因为我想计算小组成员在一次会议中是否遇到了相同的问题,如果三个成员中的一个有NA at problemtype,其他两个仍然可以同意。但如果其中两个问题类型为NA,则所有三个成员都必须获得NA at agree,因为再也没有机会计算一致性了。好的,我更改了第三个标准是.NA(problemtype)&n()==4到n()>2。谢谢,我知道这个问题可能听起来很愚蠢,但您能否告诉我如何将新变量集成到数据帧df中,以及如何使agree变量仅区分NA、0和1(但不是真或假)?该变量已经在数据帧中。df$agreement\u levels这个案例不让我把数字10和NAs放在一起。你能用TRUE和FALSE代替1和0吗?谢谢。因为我想计算小组成员在一次会议中是否遇到了同样的问题,如果三个成员中有一个有NA at problemtype,oth