Преобразование идентификатора субъекта в группах, которые различаются по размеру

#r #dataframe

Вопрос:

MWE выглядит следующим образом: у меня есть 3 группы по 2, 4 и 3 предмета последовательно. Так что у меня есть:

 library(dplyr)
Group <- c(1, 1, 2, 2, 2, 2, 3, 3, 3)
Subject_ID <- c(1, 2, 1 ,2, 3, 4, 1, 2)
df <- rbind(Group, Subject_ID)
 

Поскольку субъекты в разных группах являются разными субъектами, поэтому я хочу, чтобы идентификатор субъекта был уникальным для каждого субъекта в наборе данных. То, что я сделал, было следующим:

 Num_Subjects <- (length(unique(filter(df, Group == 1)$Subject)),
                 length(unique(filter(df, Group == 2)$Subject)),
                 length(unique(filter(df, Group == 3)$Subject)),
) 
# Then I defined a summation function to calculate how many subjects there are in all previous groups. 
sumfun <- function(x,start,end){
      return(sum(x[start:end]))
}

# Then I defined another function that generates a new subject ID for each subject in each group. 
SubjIDFn <- function(x, i) {
      x %>% filter(Session == i) %>% mutate(
            Sujbect = Subject   sumfun(Num_Subjects, 1, i-1)
      )
}
# Then I loop this from group 2 to group 3,
for (i in 2:3) {
      df.Corruption.WithoutS1 <- SubjIDFn(df.Corruption.WithoutS1, i)
}
 

Тогда набор данных содержит ноль наблюдений. Я не знаю, где это пошло не так, и я не знаю, как разумно решить эту проблему. Спасибо за вашу помощь!

Ответ №1:

Я думаю, ты немного переоцениваешь это… Если Subject_ID он уникален в группах, вы можете просто пойти с:

 library(dplyr)
Group <- c(1, 1, 2, 2, 2, 2, 3, 3, 3)
Subject_ID <- c(1, 2, 1 ,2, 3, 4, 1, 2, 3)
df <- bind_cols(Group=Group, Subject_ID=Subject_ID)
df %>% mutate(unique_id = paste(Group, Subject_ID, sep="."))

# A tibble: 9 x 3
  Group Subject_ID unique_id
  <dbl>      <dbl> <chr>    
1     1          1 1.1      
2     1          2 1.2      
3     2          1 2.1      
4     2          2 2.2      
5     2          3 2.3      
6     2          4 2.4      
7     3          1 3.1      
8     3          2 3.2      
9     3          3 3.3    
 

Обратите внимание, что я использовал bind_cols вместо rbind того, чтобы иметь фрейм данных вместо матрицы.

Комментарии:

1. Это очень полезно! Умно! Я пытался дать каждому субъекту интегральный идентификатор, но это не обязательно. Другой вопрос, могу ли я иметь цикл for в функции mutate?

2. Я никогда не пытался использовать циклы с мутацией, и я не думаю, что это возможно. Тем не менее, я узнал из мудрости этого сообщества, что циклы почти всегда являются плохой идеей. Задайте другой вопрос и предоставьте подробную информацию о том, что вам нужно сделать.

3. Хорошо, большое спасибо! Позже я достиг своей цели с group_by() %>% mutate() помощью .