r - удалить первую строку условия для субъекта в кадре данных - PullRequest
0 голосов
/ 07 июня 2018

У меня есть длинный формат данных с несколькими предметами и несколькими условиями для каждого предмета.Я хочу удалить первый ряд каждого условия (кроме первого) для всех предметов.Мой фрейм данных выглядит так:

> df <- data.frame(subj = c(rep(1,4),rep(2,4), rep(3,4)), cond = (rep(c("A", "A", "B", "B"),times=3)), value = round(runif(12, min = 0, max = 10)))
> df
subj cond value
1    A     1
1    A     5
1    B     3
1    B    10
2    A     6
2    A     5
2    B     2
2    B     0
3    A     5
3    A     8
3    B     5
3    B     2

Я нашел функцию duplicated (), но она удаляет только первую строку каждого условия для первого субъекта:

df <- df[duplicated(df$cond),]
subj cond value
 1    A     5
 1    B    10
 2    A     6
 2    A     5
 2    B     2
 2    B     0
 3    A     5
 3    A     8
 3    B     5
 3    B     2

Есть лиспособ «обнулить» нахождение дубликата всякий раз, когда начинается новый предмет?И как я могу предотвратить исключение первой строки первого условия?

Большое вам спасибо!

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Альтернатива (но зависит от фактического df):

df <- data.frame(subj = c(rep(1,4),rep(2,4), rep(3,4)), 
                 cond = (rep(c("A", "A", "B", "B"),times=3)), 
                 value = round(runif(12, min = 0, max = 10)))
df

dummy <- as.character(df$cond) # factor to character
mask <- c(FALSE, dummy[-1] == dummy[-length(dummy)])
df[mask,]
0 голосов
/ 07 июня 2018

Вы можете создать подмножество с дублированным взаимодействием двух переменных:

> df
   subj cond value
1     1    A     5
2     1    A     7
3     1    B     4
4     1    B     8
5     2    A     5
6     2    A     2
7     2    B     8
8     2    B     5
9     3    A     8
10    3    A     1
11    3    B     1
12    3    B     5

df1 <- df[!duplicated(interaction(df$subj, df$cond)),]

> df1
   subj cond value
1     1    A     5
3     1    B     4
5     2    A     5
7     2    B     8
9     3    A     8
11    3    B     1

Редактировать:

Я прочитал ваш вопрос еще раз, и, кажется, вы хотите удалитьПервый ряд, а не последний.В этом случае используйте

df1 <- df[!duplicated(interaction(df$subj, df$cond), fromLast = TRUE),]

> df1
   subj cond value
2     1    A     4
4     1    B     9
6     2    A     9
8     2    B     7
10    3    A     1
12    3    B     2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...