使用嵌套数据在行和列之间循环

时间:2019-02-28 07:05:27

标签: 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_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 ...

现在,我必须创建一个新的变量,该变量应该是名称为Agreement_levels的二进制(0/1)。因此,对于同一次学习会议,一个小组中的每个人每次都具有与同一次会议上同一小组的其他学习者相同的问题类型类别,两个学习者(或三个或四个,取决于相应会议的小组人数)应在“协议”变量中获得值1,否则他们都应获得0。每人(例如,四个学习者中)已经遇到的问题类别与其他人不同时,其上的问题为0所有人的协议变量。 如果一次会议和同一次会议的数据集中只有一个人,则必须有同意的NA。但是,当一个人的问题类型变量为NA时,并且同一会议的数据集中有2个人,则两个人的同意率均为0;但是,如果数据集中有4个人参加同一次会议,并且其中一个人的问题类型为NA,那么只有这个人,而其他人没有人同意。

我确实已经写了一个命令,但是它还不能正常工作,仍然不考虑NA:

 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

非常感谢。

dput(head(df))
structure(list(GroupID = c("1", "1", "1", "1", "1", "2"), TreffID = c("1", "1", 
"2", "2", "3", "1"), PersonID = c(171, 185, 171, 185, 
185, 113), problemtypen_oberkategorien = c("Verständnisprobleme", 
"Verständnisprobleme", "Motivationsprobleme", "Motivationsprobleme", 
"Motivationsprobleme", "Motivationsprobleme"), passung.exkl = c("0", 
"0", "0", "0", "1", "1")), row.names = c(NA, -6L), class = c("tbl_df", 
"tbl", "data.frame"))

1 个答案:

答案 0 :(得分:0)

我使用R的dplyr而不是循环。我不确定我的所有逻辑是否正确,因为那里有很多东西。例如,您没有指定NA问题类型和3个人会发生什么。但这是使用group_by的起点,因此您要在具有相同GroupID和TreffID的每组行中查找,然后是mutatecase_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())