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