Цикл между строками и столбцами с вложенными данными - PullRequest
0 голосов
/ 28 февраля 2019

У меня следующая структура данных: Встречи в группах.Группы встречались по-разному часто, и количество членов группы варьировалось для каждой встречи.

 $ 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_levels.Таким образом, каждый раз, когда человек в одной группе - в отношении одной и той же учебной встречи - имеет одну и ту же категорию типов проблем, чем другие учащиеся из той же группы на одной и той же встрече, оба учащиеся (или три или четыре, в зависимости отразмер группы для соответствующего собрания) должен получить значение 1 в переменной соглашения, в противном случае все они должны получить 0. Каждый раз, когда у человека (например, среди четырех учащихся) уже есть другая категория проблем, чем у других, появляется 0 напеременная соглашения для всех.Если в наборе данных для одного и того же собрания присутствует только 1 человек, должен быть согласен НС.Однако, когда у одного человека есть NA в переменной типа проблемы, и в наборе данных для одного и того же собрания есть 2 человека, оба получают 0 при согласии;но если в наборе данных есть 4 человека для одной и той же встречи, и у одного из них есть NA с типом проблемы, то только этот человек, но не остальные, получают 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 голосов
/ 28 февраля 2019

Вместо циклов я использовал R's dplyr.Я не уверен, правильно ли я понял всю вашу логику, поскольку там было много всего.Например, вы не указали, что будет с проблемным типом NA и 3 людьми.Но вот отправная точка, которая использует group_by, поэтому вы просматриваете каждый набор строк с одинаковыми GroupID и TreffID, а затем mutate и case_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()) 
...